使用 as_strided

问题描述

我有一个 numpy 数组:

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

我像这样用 np.repeat 复制:

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

结果:

array([[0.,[0.,8.],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.,8.]]])

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

out.reshape(-1,3)
Out[]: 
array([[0.,8.],[0.,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 是什么(以及它是否被矢量化和/或可矢量化)。