【问题标题】:Numpy repeat array along new axis沿新轴的 Numpy 重复数组
【发布时间】:2014-12-21 19:38:25
【问题描述】:

最好/最有效的方法是什么?

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

【问题讨论】:

  • 你试过...计时吗?
  • 通常,您希望将此操作应用于 last 轴,或者更好,这取决于您以后如何使用它,您可以利用 numpy 的广播并完全避免重复(这肯定会更快)。如果您给出更大的图景,我们也许可以指出如何做。

标签: python numpy multidimensional-array


【解决方案1】:

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,...] 步骤几乎没有成本。由于广播,它可能就是您所需要的。


附言使用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,...]

【讨论】:

  • index_tricks 是一个可爱的模块名称。谢谢!一旦你完全进入它的心智模型,numpy 真的很棒,遗憾的是我还没有。
猜你喜欢
  • 2011-01-22
  • 2016-12-20
  • 2011-06-29
  • 2017-06-03
  • 2015-12-15
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多