调整和拉伸NumPy数组

43

我正在使用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]

这些只是一些示例数组,实际上我将会调整多个大小的数组,而不仅仅是这些。

我是新手,似乎无法理解我需要做什么。

3个回答

48

@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]])

当第二个参数是一个 list 时,它指定了对于每行的重复。在这种情况下,因为 axis=0,所以是按行进行重复。


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]])

6
如果有人想知道,这是Kronecker积:http://docs.scipy.org/doc/numpy/reference/generated/numpy.kron.html - krawyoti
1
尽管这个答案很酷,但在我的机器上处理大数组时,它所需的时间是 dtlussier 答案中使用 repeat 方法的两倍。 - John_C

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]])
< p > (dtlussier的方案更好) < /p >

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接