python从大型mxm网格中提取每个可能的nxn网格

python从大型mxm网格中提取每个可能的nxn网格,python,numpy,grid,extract,Python,Numpy,Grid,Extract,我有一个大小为(827914)的网格,我想从中提取每个可能的(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,tm

我有一个大小为(827914)的网格,我想从中提取每个可能的(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

它将返回正确的数据和大小的数组(748930,5,5)。问题是这段代码需要大约20-30秒才能完成,并且希望有更精明/更快的东西。有什么想法吗?

这将是
的一个应用程序,正如您大踏步所做的那样:

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)

我觉得广的回答很酷

下面是我的一些简单的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)

您可以使用:
view\u as\u windows(tmp,(5,5))
以三维阵列的形式获取视图,这实际上是免费的。然后,您可以将形状重塑为所需的形状,但这会强制复制。“Stripes[1]”不应该是“tmp.Stripes[1]”吗?@M.Simpson是的,我忘了添加
Stripes=tmp.Stripes
:-)这对示例非常有效。但是,如果我有一个np.ndarray,它也有一个dtype=float32,出于某种原因,它不再工作。