如何在有和没有重叠的固定大小块中拆分 numpy 数组? [英] How to split a numpy array in fixed size chunks with and without overlap?

查看:40
本文介绍了如何在有和没有重叠的固定大小块中拆分 numpy 数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个数组:

<预><代码>>>>arr = np.array(range(9)).reshape(3, 3)>>>阿尔数组([[0, 1, 2],[3, 4, 5],[6, 7, 8]])

我想创建一个函数 f(arr, shape=(2, 2)) 它接受数组和一个形状,并将数组分成给定形状的块 没有填充.因此,如有必要,可以重叠某些部分.例如:

<预><代码>>>>f(arr, shape=(2, 2))数组([[[[[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)) 创建到上面的输出.但我不知道如何将其推广到所有数组和所有块大小.

最好用于 3D 阵列.

如果不需要重叠,则应避免重叠.另一个例子:

<预><代码>>>>arr = np.array(range(16).reshape(4,4)>>>阿尔数组([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11],[12, 13, 14, 15]])>>>f(arr, shape=(2,2))数组([[[[[0, 1],[4, 5]],[[2, 3],[6, 7]]],[[[8, 9],[12, 13]],[[10, 11],[14, 15]]]])

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

解决方案

scikit-image as view_as_windows 正是为了做到这一点 -

from skimage.util.shape import view_as_windowsview_as_windows(arr, (2,2))

样品运行 -

在[40]中:arr出[40]:数组([[0, 1, 2],[3, 4, 5],[6, 7, 8]])在 [41]: view_as_windows(arr, (2,2))出[41]:数组([[[[[0, 1],[3, 4]],[[1, 2],[4, 5]]],[[[3, 4],[6, 7]],[[4, 5],[7, 8]]]]])

<小时>

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

from skimage.util.shape import view_as_blocksview_as_blocks(arr, (2,2))

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

Preferably, for 3D arrays.

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.

解决方案

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

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 -

from skimage.util.shape import view_as_blocks

view_as_blocks(arr, (2,2))

这篇关于如何在有和没有重叠的固定大小块中拆分 numpy 数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆