Numpy沿新轴重复阵列

时间:2014-12-21 19:38:25

标签: python numpy multidimensional-array

什么是最好/最高效的方式?

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

1 个答案:

答案 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,...]