问题描述
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
是什么(以及它是否被矢量化和/或可矢量化)。