如何在有和没有重叠的固定大小块中拆分numpy数组?

Kay*_*gts 12 python arrays numpy multidimensional-array

让我们说我有一个数组:

>>> arr = np.array(range(9)).reshape(3, 3)
>>> arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
Run Code Online (Sandbox Code Playgroud)

我想创建一个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]]]])
Run Code Online (Sandbox Code Playgroud)

我设法创建输出上面的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]]]])
Run Code Online (Sandbox Code Playgroud)

skimage.util.view_as_blocks 接近,但要求阵列和块形状兼容.

Div*_*kar 11

有一个内置的scikit图像,就像view_as_windows这样做 -

from skimage.util.shape import view_as_windows

view_as_windows(arr, (2,2))
Run Code Online (Sandbox Code Playgroud)

样品运行 -

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]]]])
Run Code Online (Sandbox Code Playgroud)

对于第二部分,使用来自同一家庭/模块的表兄弟view_as_blocks-

from skimage.util.shape import view_as_blocks

view_as_blocks(arr, (2,2))
Run Code Online (Sandbox Code Playgroud)