如何将两个1维的numpy数组压缩成一个2维的numpy数组

85

我有两个numpy 1d数组,例如:

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

那我怎么能得到一个2维数组 [[1,6], [2,7], [3,8], [4,9], [5, 10]] 呢?


3
对于非常小的数组,zip 可能比调用 Numpy 函数更快,但是对于较长的数组,Numpy 函数要快得多,其中 column_stack 在我的测试中是最快的。例如,对于长度为 1000 的数组,column_stackzip 快约 1000 倍。这是一些相关的 timeit 代码 - PM 2Ring
3个回答

169

如果你有NumPy数组,你可以使用dstack()

import numpy as np

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

c = np.dstack((a,b))
#or
d = np.column_stack((a,b))

>>> c
array([[[ 1,  6],
        [ 2,  7],
        [ 3,  8],
        [ 4,  9],
        [ 5, 10]]])
>>> d
array([[ 1,  6],
       [ 2,  7],
       [ 3,  8],
       [ 4,  9],
       [ 5, 10]])

>>> c.shape
(1, 5, 2)
>>> d.shape
(5, 2)

13
或者,np.stack((a, b), axis=-1),但您的方法更简洁。 - PM 2Ring
4
就我所知,np.column_stack 是实现这一功能最快的方法,有关详细信息请参见我的问题评论。 - PM 2Ring
16
注意:np.dstack会在第三个维度上堆叠数组,因此您将创建一个不必要的维度。np.column_stacknp.stack(...,axis =-1)更为适合。 - Ryan M
2
为什么是 axis=-1 而不是 +1 - Guimoute

53

答案就在你的问题中:

np.array(list(zip(a,b)))
编辑:

尽管我的帖子按照OP的要求给出了答案,但将其转换为列表然后再转回NumPy数组会有一些开销(对于大型数组来说很明显)。

因此,dstack将是计算效率更高的选择(参见@zipa的回答)。在发布此答案时,我不知道dstack,所以感谢@zipa将其引入到这个帖子中。

编辑2:

重复问题中所示,np.c_甚至比np.dstack更短。

>>> import numpy as np
>>> a = np.arange(1, 6)
>>> b = np.arange(6, 11)
>>> 
>>> a
array([1, 2, 3, 4, 5])
>>> b
array([ 6,  7,  8,  9, 10])
>>> np.c_[a, b]
array([[ 1,  6],
       [ 2,  7],
       [ 3,  8],
       [ 4,  9],
       [ 5, 10]])

9
使用Numpy数组时,为什么要使用普通的Python函数来完成这个任务? - PM 2Ring
1
@PM2Ring 您说得对。我不知道zipa的答案,但我是第一个发布的。 - Ébe Isaac
我不喜欢有人在操作时混合两种类型的列表。 - shtse8

4
你可以使用zip
np.array(list(zip(a,b)))
array([[ 1,  6],
   [ 2,  7],
   [ 3,  8],
   [ 4,  9],
   [ 5, 10]])

1
这与@Ebe的答案有何不同? - EdChum
2
我们两个同时回答了,我晚了差不多2-3秒钟。 - akash karothiya
9
当你使用Numpy数组时,为什么要使用普通的Python函数来完成这个任务? - PM 2Ring
1
当然,我会选择 @zipa 的答案。 - akash karothiya

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