【问题标题】:How do I concatenate two one-dimensional arrays in NumPy?如何在 NumPy 中连接两个一维数组?
【发布时间】:2017-08-12 02:12:39
【问题描述】:

我有两个数组 A = [a1, ..., an]B = [b1, ..., bn]。 我想得到等于

的新矩阵 C
[[a1, b1],
 [a2, b2],
 ...
 [an, bn]]

我该如何使用numpy.concatenate

【问题讨论】:

  • 寻找np.column_stack
  • @Divakar 不错!任何直觉为什么np.column_stack 会慢一点吗?
  • @kmario23 它在底层使用了np.concatenate,所以如果你与它进行比较,它就是我们在那里支付的函数包装器开销。

标签: python numpy matrix multidimensional-array numpy-ndarray


【解决方案1】:

这个非常简单但最快的解决方案怎么样?

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 pointed out,使用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
    

    【讨论】:

    • 既然被要求使用np.concatenate,我就在这里添加C = np.concatenate((A, B)).reshape(2,3).T
    • 哦,对了!感谢@Michael 更新解决方案
    • 别误会,我认为你的解决方案更好;-)
    【解决方案3】:
    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_stacknp.vstacknp.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]])
    

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2011-05-08
      • 2020-11-13
      相关资源
      最近更新 更多