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)