将一个numpy数组的每一行与第二个numpy数组的所有行(python)相加

时间:2019-01-29 16:59:44

标签: python numpy sum row

我想知道是否有任何快速方法可以将第一个数组的每一行与第二个数组的所有行相加。在这种情况下,两个数组的colulmns数相同。例如,如果array1.shape = (n,c)array2.shape = (m,c),则结果数组将是array3.shape = ((n*m), c)

看下面的例子:

array1 = np.array([[0, 1, 2],
                   [3, 4, 5],
                   [6, 7, 8]])

array2 = np.array([[0, 1, 2],
                   [3, 4, 5]])

结果将是:

array3 = np.array([[0,  2,  4],
                   [3,  5,  7]
                   [3,  5,  7]
                   [9,  8, 10]
                   [6,  8, 10]
                   [9, 11, 13]])

我看到的唯一方法是将一个数组的每一行重复另一个数组的行数。例如,通过执行np.repeat(array1, len(array2), axis=0),然后将该数组与array2相加。但是,如果行数太大,这不是很实用。另一种方法是使用for循环,但这太慢了。

还有其他更好的方法吗??

谢谢。

2 个答案:

答案 0 :(得分:3)

array1扩展到3D,使其可以在2D array2上广播,然后执行广播加法,并且需要最终的重塑以实现所需的输出-

In [30]: (array1[:,None,:] + array2).reshape(-1,array1.shape[1])
Out[30]: 
array([[ 0,  2,  4],
       [ 3,  5,  7],
       [ 3,  5,  7],
       [ 6,  8, 10],
       [ 6,  8, 10],
       [ 9, 11, 13]])

答案 1 :(得分:1)

如果尚未尝试以下内联代码,则可以尝试。这是单线程上最简单的方法,也是最快的方法。

>>> import numpy as np
>>> array1 = np.array([[0, 1, 2],
...                    [3, 4, 5],
...                    [6, 7, 8]])
>>> 
>>> array2 = np.array([[0, 1, 2],
...                    [3, 4, 5]])
>>> array3 = np.array([i+j for i in array1 for j in array2])
>>> array3
array([[ 0,  2,  4],
       [ 3,  5,  7],
       [ 3,  5,  7],
       [ 6,  8, 10],
       [ 6,  8, 10],
       [ 9, 11, 13]])
>>> 

如果您希望通过踩踏来加快速度,则可以考虑使用CUDAmultithreading。该建议超出了您的问题范围,但使您了解了可以采取哪些措施来加快矩阵运算的速度。