Python 沿新轴的Numpy重复阵列
最好/最有效的方法是什么 x是数组,n是我希望重复的次数:Python 沿新轴的Numpy重复阵列,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,最好/最有效的方法是什么 x是数组,n是我希望重复的次数: np.repeat(x[None,...], n, axis=0) 或 请注意,对于已知的数组大小,后者变得简单: 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) 换句话说,它会在每个轴上重复一次以上。
np.repeat(x[None,...], n, axis=0)
或
请注意,对于已知的数组大小,后者变得简单:
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
会有更少的Python开销<编译代码>重复。(一些简单的测试证实了这一点-repeat
对于小型阵列要快2倍,对于大型阵列要稍微快一点)
p、 x[None,…]
步骤实际上是无成本的。由于广播的缘故,这可能就是你所需要的
p、 在美国,有一种更快的方法可以重复这个过程,使用
np.lib.index\u技巧。对于(20,50)
形状x
as_strided(x,shape=(n,20,50),strides=(0,200,4))
np.broadcast\u数组
也使用作为跨步
。所以这产生了同样的结果:
np.broadcast_arrays(np.ones((n,1,1)),x)[1]
但老实说,这只是对广播的阐述,不是真正的重复。数据还没有被复制。相同的值只使用了n次
广播可用于填充整个阵列,但计时与repeat
相同。这可能是repeat
在发动机罩下正在做的事情
z = np.empty((300,20,50),dtype=int)
z[:] = x[None,...]
你试过。。。计时?通常情况下,您希望将此操作应用于最后一个轴,或者更好,这取决于您以后如何使用它,您可以利用numpy的广播功能,完全避免重复(这肯定会更快)。如果你给出一个更大的图景,我们可能会指出。index\u tricks
是一个模块的可爱名称。谢谢一旦你完全进入它的思维模式,numpy真的很棒,可悲的是我还没有到那里。
z = np.empty((300,20,50),dtype=int)
z[:] = x[None,...]