如何解决python从大型mxm网格中提取每个可能的nxn网格
我有一个大小为(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
这将返回正确的数据和大小为(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)
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])
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。