np.repeat(np.repeat([[1, 2, 3]], 3, axis=0), 3, axis=1)
按预期工作并生成
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]])
然而,
np.repeat([[1, 2, 3]], [3, 3])
和
np.repeat([[1, 2, 3]], [3, 3], axis=0)
产生错误。
是否可以同时repeat
多个维度的数组?
答案 0 :(得分:2)
首先,我认为你提出的原始方法完全没问题。它是可读的,有意义,并且它不是很慢。
您可以使用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]])
使用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]])
没有重塑(这样你不需要知道最终长度):
>>> 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]])
并且可能有十几种其他方法可以做到这一点。但是我仍然认为你的原始版本更具惯用性,因为把它扔到额外的尺寸以使它崩溃是很奇怪的。
答案 1 :(得分:-1)
这是不可能的,请参阅repeat。但是您使用的形状为(1,3)
,因此您必须使用:
np.repeat(X, [2], axis=0)
因为np.repeat(X, [2,2], axis=0)
需要形状(2,3)
,例如
X = np.array([[1, 2, 3], [5, 6, 7]])
np.repeat(X, [2, 5], axis=0)
输出如下:
[[1 2 3]
[1 2 3]
[5 6 7]
[5 6 7]
[5 6 7]
[5 6 7]]
这意味着[2,5]
代表[ 2 ,5]:2x first row
和[2, 5 ]:5x second row
(形状:(2, *doesn't matter*)
因为axis=0
表示您想重复这些行。
因此,您首先必须生成尺寸为(3, *)
的数组,然后生成下一个数组。
如果你想重复你的阵列:
np.repeat(X2, [5], axis=0)
产生
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
因为你只有一维数组。
np.repeat
的第一次调用产生2D数组,第二次调用重复列。如果您想使用np.repeat(X2, [5], axis=0)
,则会得到与上述帖子中提到的相同的结果,因为您必须在np.repeat
的输出上第二次调用np.repeat(X2, [5], axis=0)
。
在我看来,使用np.repeat
是实现输出的最简单,最好的方法。
编辑:希望答案现在更明确