使用view_as_windows from scikit-image 非常简单,可以将这些滑动窗口视图作为一个 6D 数组,其中第四轴是单例的。然后,使用advanced-indexing 根据y 和x 索引选择我们想要的索引,以便索引到窗口数组的第二和第三轴,以获得我们的B。
因此,实现将是 -
from skimage.util.shape import view_as_windows
BSZ = 16, 16 # Blocksize
A6D = view_as_windows(A,(1,BSZ[0],BSZ[1]))
B_out = A6D[np.arange(N),y,x,0]
说明
为了向其他读者解释问题的真正原因,这里有一个在较小的数据集上运行的示例,块大小为(2,2) -
1) 输入数组(3D):
In [78]: A
Out[78]:
array([[[ 5, 5, 3, 5, 3, 8],
[ 5, *2, 6, 2, 2, 4],
[ 4, 3, 4, 9, 3, 8],
[ 6, 3, 3, 10, 4, 5],
[10, 2, 5, 7, 6, 7],
[ 5, 4, 2, 5, 2, 10]],
[[ 4, 9, 8, 4, 9, 8],
[ 7, 10, 8, 2, 10, 9],
[10, *9, 3, 2, 4, 7],
[ 5, 10, 8, 3, 5, 4],
[ 6, 8, 2, 4, 10, 4],
[ 2, 8, 6, 2, 7, 5]],
[[ *4, 8, 7, 2, 9, 9],
[ 2, 10, 2, 3, 8, 8],
[10, 7, 5, 8, 2, 10],
[ 7, 4, 10, 9, 6, 9],
[ 3, 4, 9, 9, 10, 3],
[ 6, 4, 10, 2, 6, 3]]])
2) y 和 x 索引以索引到第二和第三轴:
In [79]: y
Out[79]: array([1, 2, 0])
In [80]: x
Out[80]: array([1, 1, 0])
3) 最后是所需的输出,它是每个 2D 切片沿第一个轴的一个块,其起点(左上角点)是该 2D 切片上的(y,x)。请参阅 A 中的星号 -
In [81]: B
Out[81]:
array([[[ 2, 6],
[ 3, 4]],
[[ 9, 3],
[10, 8]],
[[ 4, 8],
[ 2, 10]]])