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同时处理多个维度的数组?
首先,我认为你提出的原始方法完全没问题。它具有可读性、有意义,而且速度也不是很慢。
您可以使用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)
可能还有十几种其他方法可以做到这一点。但我仍然认为你的原始版本更惯用,因为将它扔到额外的维度中以将其折叠起来很奇怪。