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

时间:2017-09-29 11:40:37

标签: python numpy

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多个维度的数组?

2 个答案:

答案 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是实现输出的最简单,最好的方法。

编辑:希望答案现在更明确