python 从大型 mxm 网格中提取所有可能的 nxn 网格
python extract every possible nxn grid from large mxm grid
我有一个大小为 (827,914) 的网格,我想从中提取所有可能的 (5,5) 网格。以下代码按预期工作:
import numpy as np
N = 827
M = 914
gsize = 5
tmp = np.random.normal(0,1,(N,M))
alldata = np.zeros([(tmp.shape[0] - gsize + 1) * (tmp.shape[1] - gsize + 1),gsize, gsize])
county = 0
for i in range(0,tmp.shape[0] - gsize + 1):
for j in range(0,tmp.shape[1] - gsize + 1):
for k in range(i,i+gsize):
for l in range(j,j+gsize):
alldata[county,k-i,l-j] = tmp[k,l]
county += 1
这将 return 正确的数据和大小数组 (748930,5,5)。问题是这段代码需要大约 20-30 秒才能完成,并且希望有一些更精明/更快的东西。有什么想法吗?
这将是 as_strided
:
的应用程序
from numpy.lib.stride_tricks import as_strided
a = as_strided(tmp, ((N-gsize+1),(M-gsize+1),gsize,gsize),
(strides[1], strides[1]) + tmp.strides
).reshape(-1, gsize, gsize)
print(a.shape)
# (748930, 5, 5)
我觉得Quang的回答很酷
这是我的一些简单的 numpy 索引:
import numpy as np
N = 827
M = 914
gsize = 5
tmp = np.random.normal(0,1,(N,M))
alldata = np.zeros([(N - gsize + 1) * (M - gsize + 1),gsize, gsize])
ind = 0
for i in range(N - gsize + 1):
for j in range(M - gsize + 1):
alldata[ind] = tmp[i:i+gsize, j:j+gsize]
ind += 1
print(alldata)
我有一个大小为 (827,914) 的网格,我想从中提取所有可能的 (5,5) 网格。以下代码按预期工作:
import numpy as np
N = 827
M = 914
gsize = 5
tmp = np.random.normal(0,1,(N,M))
alldata = np.zeros([(tmp.shape[0] - gsize + 1) * (tmp.shape[1] - gsize + 1),gsize, gsize])
county = 0
for i in range(0,tmp.shape[0] - gsize + 1):
for j in range(0,tmp.shape[1] - gsize + 1):
for k in range(i,i+gsize):
for l in range(j,j+gsize):
alldata[county,k-i,l-j] = tmp[k,l]
county += 1
这将 return 正确的数据和大小数组 (748930,5,5)。问题是这段代码需要大约 20-30 秒才能完成,并且希望有一些更精明/更快的东西。有什么想法吗?
这将是 as_strided
:
from numpy.lib.stride_tricks import as_strided
a = as_strided(tmp, ((N-gsize+1),(M-gsize+1),gsize,gsize),
(strides[1], strides[1]) + tmp.strides
).reshape(-1, gsize, gsize)
print(a.shape)
# (748930, 5, 5)
我觉得Quang的回答很酷
这是我的一些简单的 numpy 索引:
import numpy as np
N = 827
M = 914
gsize = 5
tmp = np.random.normal(0,1,(N,M))
alldata = np.zeros([(N - gsize + 1) * (M - gsize + 1),gsize, gsize])
ind = 0
for i in range(N - gsize + 1):
for j in range(M - gsize + 1):
alldata[ind] = tmp[i:i+gsize, j:j+gsize]
ind += 1
print(alldata)