如何在NumPy中连接两个一维数组?

3
我有两个数组 A = [a1, ..., an]B = [b1, ..., bn]。 我想得到一个新的矩阵 C,它等于

[[a1, b1],
 [a2, b2],
 ...
 [an, bn]]

我该如何使用numpy.concatenate来做到这一点?

1
寻找 np.column_stack - Divakar
@Divakar 不错!你有什么直觉,为什么 np.column_stack 会稍微慢一点吗? - kmario23
1
@kmario23 好的,它在内部使用 np.concatenate,所以如果你要与之进行比较,那么我们需要支付的是函数包装器的开销。 - Divakar
3个回答

4
这个非常简单但是最快的解决方案怎么样?
In [73]: a = np.array([0, 1, 2, 3, 4, 5])
In [74]: b = np.array([1, 2, 3, 4, 5, 6])
In [75]: ab = np.array([a, b])
In [76]: c = ab.T

In [77]: c
Out[77]: 
array([[0, 1],
       [1, 2],
       [2, 3],
       [3, 4],
       [4, 5],
       [5, 6]])

但是,正如Divakar所指出的,使用np.column_stack可以直接得到答案,如下所示:

In [85]: np.column_stack([a, b])
Out[85]: 
array([[0, 1],
       [1, 2],
       [2, 3],
       [3, 4],
       [4, 5],
       [5, 6]])

效率 (按降序排列)

有趣的是,我的简单解决方案竟然是最快的。(比np.concatenate稍微快一点,比np.column_stack快两倍,比np.vstack快三倍)。

In [86]: %timeit np.array([a, b]).T
100000 loops, best of 3: 4.44 µs per loop

In [87]: %timeit np.concatenate((a[:,None], b[:,None]), axis=1)
100000 loops, best of 3: 5.6 µs per loop

In [88]: %timeit np.column_stack([a, b])
100000 loops, best of 3: 9.5 µs per loop

In [89]: %timeit np.vstack((a, b)).T
100000 loops, best of 3: 14.7 µs per loop

2
您也可以使用 np.vstack,然后在转置矩阵。
import numpy as np
A = [1, 2, 3]
B = [4, 5, 6]
C = np.vstack((A, B)).T

1
既然要使用 np.concatenate,那我就在这里加上 C = np.concatenate((A, B)).reshape(2,3).T - Michael H.
哦,没错!感谢 @Michael 更新了解决方案。 - titipata
别误会,我认为你的解决方案更好;-) - Michael H.

0
In [26]: A=np.arange(5)
In [27]: B=np.arange(10,15)
In [28]: np.concatenate((A[:,None], B[:,None]), axis=1)
Out[28]: 
array([[ 0, 10],
       [ 1, 11],
       [ 2, 12],
       [ 3, 13],
       [ 4, 14]])
In [29]: _.tolist()
Out[29]: [[0, 10], [1, 11], [2, 12], [3, 13], [4, 14]]

np.column_stack, np.vstack, np.stack 都是做同样的事情,只是以不同方式扩展数组的维度。

np.stack((A,B),-1) 以我所做的方式扩展数组,使用 newaxis 索引。

np.column_stack((A,B)) 使用:

arr = array(arr, copy=False, subok=True, ndmin=2).T

np.vstack((A,B)).T 的作用是:

concatenate([atleast_2d(_m) for _m in tup], 0)

出于好奇,注意这个vstack的等效方法:

In [38]: np.concatenate((A[None],B[None]))
Out[38]: 
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14]])

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