如何將一個numpy數組分割成固定大小的塊,是否有重疊?

[英]How to split a numpy array in fixed size chunks with and without overlap?


Lets say I have an array:

假設我有一個數組:

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

I would like to create a function f(arr, shape=(2, 2)) that takes the array and a shape, and splits the array into chunks of the given shape without padding. Thus, by overlapping certain parts if necessary. For example:

我想要創建一個函數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]]]])

I managed to creates to output above with np.lib.stride_tricks.as_strided(arr, shape=(2, 2, 2, 2), strides=(24, 8, 24, 8)). But I don't know how to generalize this for to all arrays and all chunk sizes.

我使用np.lib.stride_tricks創建到上面的輸出。as_strided(arr, shape=(2,2,2,2, 2), stride =(24,8,24, 8))但我不知道如何將它推廣到所有數組和所有塊大小。

Preferably, for 3D arrays.

最好是,3 d數組。

If no overlap is necessary, it should avoid that. Another example:

如果不需要重疊,就應該避免重疊。另一個例子:

>>> 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 comes close, but requires that the array and block shape are compatible.

skimage.util。view_as_blocks非常接近,但要求數組和塊形狀是兼容的。

1 个解决方案

#1


8  

There's a builtin in scikit-image as view_as_windows for doing exactly that -

在scikit-image中有一個作為view_as_windows的內建框,用於實現這一點

from skimage.util.shape import view_as_windows

view_as_windows(arr, (2,2))

Sample run -

樣本運行-

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]]]])

For the second part, use its cousin from the same family/module view_as_blocks -

對於第二部分,使用來自同一家族/模塊view_as_blocks -的表親

from skimage.util.shape import view_as_blocks

view_as_blocks(arr, (2,2))

注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2017/03/16/712b33033c433526120667bd6d6b7990.html



 
粤ICP备14056181号  © 2014-2021 ITdaan.com