numpy 我可以使用整形+转置技巧来创建重叠平铺吗?

tct7dpnv  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(69)

我有一个非常大的数组,我想平铺重叠。例如,如果数组看起来像

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

我想把它分成3 x 3个图块,每个图块在每一边与相邻的图块重叠1:

a b c    c d e
f g h    h i j
k l m    m n o

k l m    m n o
p q r    r s t
u v w    w x y

“整形和转置技巧”(在https://www.kaggle.com/c/hubmap-kidney-segmentation/discussion/202171中描述)是一种在Python(和其他语言)中平铺大型数组的方法,允许提取和表示邻接(不重叠)的瓦片 *,而不必复制底层数据数组 *。
我想知道的是如果我们想让瓷砖重叠,可以使用这个技巧吗?如果是,如何进行?

7hiiyaii

7hiiyaii1#

我不认为这可以单独通过整形来完成,但可以使用较低级别的numpy.lib.stride_tricks.as_strided函数来完成,仔细设置shapestrides参数:

>>> x = np.arange(25).reshape(5, 5)

>>> x
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

>>> y = np.lib.stride_tricks.as_strided(x, shape=(2, 2, 3, 3),
...                                     strides=(80, 16, 40, 8))

>>> y
array([[[[ 0,  1,  2],
         [ 5,  6,  7],
         [10, 11, 12]],

        [[ 2,  3,  4],
         [ 7,  8,  9],
         [12, 13, 14]]],

       [[[10, 11, 12],
         [15, 16, 17],
         [20, 21, 22]],

        [[12, 13, 14],
         [17, 18, 19],
         [22, 23, 24]]]])

第二个数组被分割成重叠的切片,您可以确认这两个数组共享相同的内存:

>>> np.byte_bounds(x) == np.byte_bounds(y)
True

因此,y是x的新视图。'shape'指定y在每个维度中的形状。在每个维度中,“步幅”指定其元素的起始位置之间的距离,这取决于x的原始内存排列。

相关问题