np.lib.stride_tricks.as_strided
。这个解决方案不需要步幅来划分输入堆栈的相应维度。它甚至允许重叠的补丁(在这种情况下,不要写入结果,或者进行复制)。因此,它比其他方法更灵活。import numpy as np
from numpy.lib import stride_tricks
def cutup(data, blck, strd):
sh = np.array(data.shape)
blck = np.asanyarray(blck)
strd = np.asanyarray(strd)
nbl = (sh - blck) // strd + 1
strides = np.r_[data.strides * strd, data.strides]
dims = np.r_[nbl, blck]
data6 = stride_tricks.as_strided(data, strides=strides, shape=dims)
return data6#.reshape(-1, *blck)
#demo
x = np.zeros((5, 6, 12), int)
y = cutup(x, (2, 2, 3), (3, 3, 5))
y[...] = 1
print(x[..., 0], '\n')
print(x[:, 0, :], '\n')
print(x[0, ...], '\n')
输出:
[[1 1 0 1 1 0]
[1 1 0 1 1 0]
[0 0 0 0 0 0]
[1 1 0 1 1 0]
[1 1 0 1 1 0]]
[[1 1 1 0 0 1 1 1 0 0 0 0]
[1 1 1 0 0 1 1 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0]
[1 1 1 0 0 1 1 1 0 0 0 0]
[1 1 1 0 0 1 1 1 0 0 0 0]]
[[1 1 1 0 0 1 1 1 0 0 0 0]
[1 1 1 0 0 1 1 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0]
[1 1 1 0 0 1 1 1 0 0 0 0]
[1 1 1 0 0 1 1 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0]]
skimage
模块提供了一个集成的解决方案,其中包括view_as_blocks。源代码在线上。
请注意选择Deep,Weight,Height
是pd, pw, ph
的倍数,因为as_strided
不会检查边界。
as_strided
的整个目的是为了适应不将输入维度划分为块维度的情况。只有基于reshape
的解决方案才有此限制。 - Paul Panzerview_as_windows
可以在这种情况下帮助你? - B. M.view_as_windows
。你认为view_as_windows
支持随机选择补丁吗? - user3051460