36

我在 Python 中工作,我有一个像这样的NumPy数组:

[1,5,9]
[2,7,3]
[8,4,6]

如何将其拉伸到以下内容?

[1,1,5,5,9,9]
[1,1,5,5,9,9]
[2,2,7,7,3,3]
[2,2,7,7,3,3]
[8,8,4,4,6,6]
[8,8,4,4,6,6]

这些只是一些示例数组,实际上我将调整几种数组大小,而不仅仅是这些。

我是这方面的新手,我似乎无法完全理解我需要做的事情。

4

3 回答 3

40

@KennyTM 的答案非常巧妙,确实适用于您的情况,但作为替代方案,它可能为扩展数组提供更多灵活性,请尝试np.repeat

>>> a = np.array([[1, 5, 9],
              [2, 7, 3],
              [8, 4, 6]])

>>> np.repeat(a,2, axis=1)
array([[1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6]])

因此,这完成了沿一个轴重复,沿多个轴(如您可能想要的那样),只需嵌套np.repeat调用:

>>> np.repeat(np.repeat(a,2, axis=0), 2, axis=1)
array([[1, 1, 5, 5, 9, 9],
       [1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6],
       [8, 8, 4, 4, 6, 6]])

您还可以改变任何初始行或列的重复次数。例如,如果您想要除最后一行之外的每行重复两次:

>>> np.repeat(a, [2,2,1], axis=0)
array([[1, 5, 9],
       [1, 5, 9],
       [2, 7, 3],
       [2, 7, 3],
       [8, 4, 6]])

在这里,当第二个参数是 a 时list,它指定逐行(在这种情况下为行,因为axis=0)为每一行重复。

于 2010-11-19T16:46:37.073 回答
19
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> numpy.kron(a, [[1,1],[1,1]])
array([[1, 1, 5, 5, 9, 9],
       [1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6],
       [8, 8, 4, 4, 6, 6]])
于 2010-11-19T15:28:53.257 回答
2

不幸的是,numpy 不允许小数步(据我所知)。这是一种解决方法。它不像 Kenny 的解决方案那样聪明,但它利用了传统的索引:

>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> step = .5
>>> xstop, ystop = a.shape
>>> x = numpy.arange(0,xstop,step).astype(int)
>>> y = numpy.arange(0,ystop,step).astype(int)
>>> mg = numpy.meshgrid(x,y)
>>> b = a[mg].T
>>> b
array([[1, 1, 5, 5, 9, 9],
       [1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6],
       [8, 8, 4, 4, 6, 6]])

(dtlussier 的解决方案更好)

于 2010-11-19T16:53:21.113 回答