什么是最好/最高效的方式?
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
答案 0 :(得分:6)
np.tile
的部分代码是:
for i, nrep in enumerate(tup):
if nrep!=1:
c = c.reshape(-1, n).repeat(nrep, 0)
换句话说,它在每个轴上都有repeat
,重复次数超过1次。效果是repeat
对多个轴的推广。
所以我希望时间类似,但普通repeat
将减少Python开销。编译repeat
。 (一些简单的测试证实了这一点 - 对于小型阵列,repeat
快2倍,对于大型阵列则快一点。)
P.S。 x[None,...]
步骤几乎是无成本的。由于广播,它可能就是你所需要的一切。
p.s.s。使用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
的时间相同。这可能是repeat
在幕后做的事情。
z = np.empty((300,20,50),dtype=int)
z[:] = x[None,...]