可以说我有一个数组:
>>> arr = np.array(range(9)).reshape(3, 3) >>> arr array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
我想创建一个f(arr, shape=(2, 2))接受数组和形状的函数,然后将数组拆分为给定形状的块 而无需 填充。因此,如有必要,通过重叠某些部分。例如:
f(arr, shape=(2, 2))
>>> f(arr, shape=(2, 2)) array([[[[0, 1], [3, 4]], [[1, 2], [4, 5]]], [[[3, 4], [6, 7]], [[4, 5], [7, 8]]]])
我设法创建了以上输出np.lib.stride_tricks.as_strided(arr, shape=(2, 2, 2, 2), strides=(24, 8, 24, 8))。但是我不知道如何将其推广到所有数组和所有块大小。
np.lib.stride_tricks.as_strided(arr, shape=(2, 2, 2, 2), strides=(24, 8, 24, 8))
优选地,对于3D阵列。
如果没有必要重叠,则应避免重叠。另一个例子:
>>> arr = np.array(range(16).reshape(4,4) >>> arr array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> f(arr, shape=(2,2)) array([[[[0, 1], [4, 5]], [[2, 3], [6, 7]]], [[[8, 9], [12, 13]], [[10, 11], [14, 15]]]])
skimage.util.view_as_blocks 接近,但要求数组和块形状兼容。
skimage.util.view_as_blocks
在scikit-image中view_as_windows有一个内置的功能可以做到这一点-
view_as_windows
from skimage.util.shape import view_as_windows view_as_windows(arr, (2,2))
样品运行-
In [40]: arr Out[40]: array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) In [41]: view_as_windows(arr, (2,2)) Out[41]: array([[[[0, 1], [3, 4]], [[1, 2], [4, 5]]], [[[3, 4], [6, 7]], [[4, 5], [7, 8]]]])
对于第二部分,请使用其同一个家族/模块的表亲view_as_blocks-
view_as_blocks
from skimage.util.shape import view_as_blocks view_as_blocks(arr, (2,2))