最佳/最有效的方式是什么?
其中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)
换句话说,它在每个轴上执行
repeat
,重复次数超过1。实际上,它是repeat
到多个轴的推广。因此,尽管普通的
repeat
将具有较少的Python开销,但我希望其时序是相似的。 repeat
已编译。 (一些简单的测试证实了这一点-小型数组的repeat
快2倍,大型数组的x[None,...]
快一点)。p.s.
np.lib.index_tricks.as_strided
步骤实际上是没有成本的。由于广播,这可能就是您所需要的。ps.s.有一种使用
(20,50)
进行重复的更快的方法。对于x
形的np.broadcast_arrays
,as_strided(x,shape=(n,20,50),strides=(0,200,4))
as_strided
也使用n
。因此,这将产生相同的结果:np.broadcast_arrays(np.ones((n,1,1)),x)[1]
但是,老实说,这只是广播方面的阐述,并不是真正的重复。数据尚未复制。相同的值仅用于
repeat
时间。广播可以用来填充整个数组,但是时序与
repeat
相同。那可能就是ojit_code在后台执行的操作。z = np.empty((300,20,50),dtype=int)
z[:] = x[None,...]
关于python - 沿新轴的Numpy重复数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27593024/