首页 > 解决方案 > 使用 as_strided 沿给定轴重复

问题描述

我有一个 numpy 数组:

a = array([[0., 1., 2.],
           [3., 4., 5.],
           [6., 7., 8.]])

我这样复制np.repeat

np.repeat(a, 3, axis=0)

结果:

array([[0., 1., 2.],
       [0., 1., 2.],
       [0., 1., 2.],
       [3., 4., 5.],
       [3., 4., 5.],
       [3., 4., 5.],
       [6., 7., 8.],
       [6., 7., 8.],
       [6., 7., 8.]])

我可以np.lib.stride_tricks.as_strided通过避免复制数据来实现相同的目标吗?对于多维数组,我也需要类似的东西,但我总是沿着第 0 轴重复......

标签: numpyarray-broadcasting

解决方案


我不认为这是可能的。你可以靠近:

n=3
out = np.lib.stride_tricks.as_strided(a, 
                                      shape   = (n,) + a.shape, 
                                      strides = (0,) + a.strides
                                     )
np.shares_memory(a, out)
Out[]: True

out
Out[]: 
array([[[0., 1., 2.],
        [3., 4., 5.],
        [6., 7., 8.]],

       [[0., 1., 2.],
        [3., 4., 5.],
        [6., 7., 8.]],

       [[0., 1., 2.],
        [3., 4., 5.],
        [6., 7., 8.]]])

但这不是在维度 0 中重复,而是在新维度 0 中重复所有内容。重塑会创建一个副本:

out.reshape(-1, 3)
Out[]: 
array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.],
       [0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.],
       [0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]])

np.shares_memory(a, out.reshape(-1, 3))
Out[]: False

您通常会更好地使用广播,例如:

op(a_repeated, b)

到:

op(a[None, ...], b.reshape((-1, a.shape[0]) + b.shape[1:])) )

但这在很大程度上取决于它是什么op(以及它是否是矢量化和/或可矢量化的)。


推荐阅读