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