假设我们有两个矩阵A
和B
,并且矩阵C
为A*B
(矩阵乘法不是元素)。我们希望只获得C
的对角条目,这可以通过np.diagonal(C)
完成。但是,这会导致不必要的时间开销,因为我们将A与B相乘,即使我们只需要A
中每行的乘法与B
的具有相同“id”的列,是A
的第1行,第1列为B
,第2行为A
,第2列为B
,依此类推:构成{{1的对角线的乘法}}。有没有办法使用Numpy有效地实现这一目标?我想避免使用循环来控制哪一行与哪一列相乘,相反,我希望有一个内置的numpy方法来执行这种操作来优化性能。
提前致谢..
答案 0 :(得分:15)
我可以在这里使用einsum
:
>>> a = np.random.randint(0, 10, (3,3))
>>> b = np.random.randint(0, 10, (3,3))
>>> a
array([[9, 2, 8],
[5, 4, 0],
[8, 0, 6]])
>>> b
array([[5, 5, 0],
[3, 5, 5],
[9, 4, 3]])
>>> a.dot(b)
array([[123, 87, 34],
[ 37, 45, 20],
[ 94, 64, 18]])
>>> np.diagonal(a.dot(b))
array([123, 45, 18])
>>> np.einsum('ij,ji->i', a,b)
array([123, 45, 18])
对于较大的数组,它比直接进行乘法要快得多:
>>> a = np.random.randint(0, 10, (1000,1000))
>>> b = np.random.randint(0, 10, (1000,1000))
>>> %timeit np.diagonal(a.dot(b))
1 loops, best of 3: 7.04 s per loop
>>> %timeit np.einsum('ij,ji->i', a, b)
100 loops, best of 3: 7.49 ms per loop
[注意:最初我已经完成了元素版本ii,ii->i
,而不是矩阵乘法。相同的einsum
技巧有效。]
答案 1 :(得分:-1)
def diag(A,B):
diags = []
for x in range(len(A)):
diags.append(A[x][x] * B[x][x])
return diags
我相信上面的代码是您正在寻找的。 p>