最佳/最有效的方式是什么?

其中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/

10-11 22:46
查看更多