最好/最高效的方法是什么?
其中 x 是数组,n 是我希望重复的次数:
np.repeat(x[None,...], n, axis=0)
或
ones = [1] * len(x.shape)
np.tile(x, tuple(n, *ones))
请注意,对于已知的数组大小,后者变得简单:
np.tile(x, (n, 1, 1)) # x is 2D
最佳答案
np.tile
的部分代码是:
for i, nrep in enumerate(tup):
if nrep!=1:
c = c.reshape(-1, n).repeat(nrep, 0)
换句话说,它在每个轴上重复
超过 1 次重复。实际上,它是重复
到多个轴的概括。
所以我希望时间是相似的,尽管简单的 repeat
会有更少的 Python 开销。 repeat
已编译。 (一些简单的测试证实了这一点 - repeat
对于小数组来说快 2 倍,对于大数组来说稍微快一些)。
附: x[None,...]
步骤实际上是无成本的。由于广播,这可能就是您所需要的。
附注有一种更快的方法可以重复执行此操作,即使用 np.lib.index_tricks.as_strided 。对于 (20,50)
形状的 x
,
as_strided(x,shape=(n,20,50),strides=(0,200,4))
np.broadcast_arrays
也使用 as_strided
。所以这会产生相同的结果:
np.broadcast_arrays(np.ones((n,1,1)),x)[1]
但说实话,这只是广播的阐述,而不是真正的重复。数据尚未被复制。相同的值仅使用 n
次。
广播可用于填充完整数组,但时间与重复
相同。这可能就是 repeat
在幕后所做的事情。
z = np.empty((300,20,50),dtype=int)
z[:] = x[None,...]
关于python - Numpy 沿新轴重复数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27593024/