numpy中的元素级联

时间:2019-05-21 21:10:36

标签: numpy concatenation vectorization

我正在尝试将2个数组元素明智地连接起来。我进行了级联以产生正确的形状,但尚未在元素上应用它。

所以我有这个数组

[0, 1]
[2, 3]
[4, 5]

我想用每个元素附加数组中的每个元素。目标结果将是

[0, 1, 0, 1]
[0, 1, 2, 3]
[0, 1, 4, 5]
[2, 3, 0, 1]
[2, 3, 2, 3]
[2, 3, 4, 5]
[4, 5, 0, 1]
[4, 5, 2, 3]
[4, 5, 4, 5] 

我认为我可能需要换一个轴,但是这样我就无法使广播工作。

任何帮助将不胜感激。在numpy中有很多值得学习的地方!

a = np.arange(6).reshape(3, 2))
b = np.concatenate((a, a), axis=1)

2 个答案:

答案 0 :(得分:2)

一种方法是堆叠使用np.repeatnp.tile创建的复制版本-

In [52]: n = len(a)

In [53]: np.hstack((np.repeat(a,n,axis=0),np.tile(a,(n,1))))
Out[53]: 
array([[0, 1, 0, 1],
       [0, 1, 2, 3],
       [0, 1, 4, 5],
       [2, 3, 0, 1],
       [2, 3, 2, 3],
       [2, 3, 4, 5],
       [4, 5, 0, 1],
       [4, 5, 2, 3],
       [4, 5, 4, 5]])

由于您提到了broadcasted-assignment-

broadcasting

答案 1 :(得分:1)

一种解决方案是在senderle的cartesian_product上构建,以将其扩展到2D数组。这是我通常的操作方式:

# Your input array.
arr    
# array([[0, 1],
#        [2, 3],
#        [4, 5]])

idxs = cartesian_product(*[np.arange(len(arr))] * 2)
arr[idxs].reshape(idxs.shape[0], -1)    
# array([[0, 1, 0, 1],
#        [0, 1, 2, 3],
#        [0, 1, 4, 5],
#        [2, 3, 0, 1],
#        [2, 3, 2, 3],
#        [2, 3, 4, 5],
#        [4, 5, 0, 1],
#        [4, 5, 2, 3],
#        [4, 5, 4, 5]])