使用 as_strided 沿给定轴重复

Repeat along given axis with 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 轴重复...

我认为这是不可能的。你可以近距离接触:

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 是什么(以及它是否矢量化 and/or 可矢量化)。