成对组合两个数组中的元素

Posted

技术标签:

【中文标题】成对组合两个数组中的元素【英文标题】:Combine elements from two arrays by pairs 【发布时间】:2018-12-13 23:44:24 【问题描述】:

所以我想连接两个数组但成对。输入如下:

a = array([1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
b = array([0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0])

输出应该如下:

out_put = 
[[1, 0],
[1, 0],
[0, 1],
[1, 0],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[1, 0]]

我设法通过遍历两个数组得到这样的结果

out_put = [[a[i],b[i]] for i in range(len(a)]

但我想知道是否有更快的方法。

谢谢

【问题讨论】:

【参考方案1】:

对于矢量化解决方案,您可以堆叠和转置:

a = np.array([1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
b = np.array([0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0])

c = np.vstack((a, b)).T
# or, c = np.dstack((a, b))[0]

array([[1, 0],
       [1, 0],
       [0, 1],
       [1, 0],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 1],
       [1, 0]])

【讨论】:

或者只是np.dstack((a, b)),虽然它只是连接的包装 @BradSolomon,谢谢,认为您还需要使用该解决方案为 [0] 编制索引。 @BradSolomon column_stackdstack 没有为 2 个一维数组添加额外维度【参考方案2】:

您可以像这样使用zip 函数来组合任意两个可迭代对象。它将一直持续到到达较短的可迭代对象的末尾

list(zip(a, b))
# [(1, 0), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0)]

【讨论】:

注意:zip + NumPy 数组实际上效率低下:参见this answer。【参考方案3】:

使用np.column_stack

将一维数组作为列堆叠成一个二维数组。

np.column_stack((a, b))

array([[1, 0],  
       [1, 0],  
       [0, 1],  
       [1, 0],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [0, 1],  
       [1, 0]]) 

【讨论】:

以上是关于成对组合两个数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章

javascript数组中条目的成对组合

Python - 优化 N 中的 2 与 N 非常大的组合

JAVA中的数组合并问题

R语言两个字符串数组的叉积组合

labview 数组中相邻元素抽取和组合(截取)

c++两个数组合并成一个新数组