一次在多个维度上重复 NumPy 数组?

Max*_*axB 7 python numpy

np.repeat(np.repeat([[1, 2, 3]], 3, axis=0), 3, axis=1)
Run Code Online (Sandbox Code Playgroud)

按预期工作并产生

array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3]])
Run Code Online (Sandbox Code Playgroud)

然而,

np.repeat([[1, 2, 3]], [3, 3])
Run Code Online (Sandbox Code Playgroud)

和

np.repeat([[1, 2, 3]], [3, 3], axis=0)
Run Code Online (Sandbox Code Playgroud)

产生错误。

是否可以repeat同时处理多个维度的数组?

alk*_*asm 6

首先,我认为你提出的原始方法完全没问题。它具有可读性、有意义,而且速度也不是很慢。

您可以使用repeat 方法而不是函数,这样读起来会更好一些:

>>> x.repeat(3, 1).repeat(3, 0)
array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3]])
Run Code Online (Sandbox Code Playgroud)

利用 numpy 的广播规则,可能有多种方法来创建重复数据并将其转换为您想要的形状。一种方法可能是使用np.broadcast_to()并重复维度中的数据D+1,其中D是您需要的维度,然后将其折叠到D。

例如:

>>> x = np.array([[1, 2, 3]])
>>> np.broadcast_to(x.T, (3, 3, 3)).reshape((3, 9))
array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3]])
Run Code Online (Sandbox Code Playgroud)

并且无需重塑(这样您就不需要知道最终长度):

>>> np.hstack(np.broadcast_to(x, (3, 3, 3)).T)
array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3],
       [1, 1, 1, 2, 2, 2, 3, 3, 3]])
Run Code Online (Sandbox Code Playgroud)

可能还有十几种其他方法可以做到这一点。但我仍然认为你的原始版本更惯用,因为将它扔到额外的维度中以将其折叠起来很奇怪。