【问题标题】:python extract every possible nxn grid from large mxm gridpython从大型mxm网格中提取每个可能的nxn网格
【发布时间】:2020-09-11 19:19:18
【问题描述】:

我有一个大小为 (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 秒才能完成,并且希望有一些更精明/更快的东西。有什么想法吗?

【问题讨论】:

标签: python numpy grid extract


【解决方案1】:

这将是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)

【讨论】:

  • 'strides[1]' 不应该是 'tmp.strides[1]' 吗?
  • @M.Simpson 是的,我忘了添加strides = tmp.strides :-)
  • 这非常适合这个例子。但是,如果我有一个也有 dtype=float32 的 np.ndarray,由于某种原因它不再起作用。
【解决方案2】:

我觉得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)

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2015-06-05
    相关资源
    最近更新 更多