【问题标题】:Can I use the reshape + transpose trick to create tiling with overlap?我可以使用 reshape + transpose 技巧来创建重叠的平铺吗?
【发布时间】:2021-01-16 04:23:08
【问题描述】:

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

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(和其他语言)中平铺大型数组的方法 这允许提取和表示邻接(不是重叠)图块无需复制基础数据数组

我想知道的是:如果我们想要拼贴重叠,可以使用这个技巧吗?如上所示? 如果有,怎么做?

【问题讨论】:

  • 阅读as_strided 文档,注意其中的警告。虽然这使得view 无需复制,但对view 的进一步操作可能会导致复制,并破坏您的记忆。在图块上执行mean 之类的还原操作是最安全的。

标签: python-3.x numpy multidimensional-array


【解决方案1】:

我认为这不能单独通过重塑来完成,但是可以使用较低级别的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]]]])

第二个数组被分割成重叠的tile,可以确认两个数组共享同一个内存:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2011-01-28
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多