3

在 NumPy 中:

A = np.array([[1,2,3],[4,5,6]])
array([[1, 3, 5],
       [2, 4, 6]])

B = np.array([[1,2],[3,4],[5,6]])
array([[1, 2],
       [3, 4],
       [5, 6]])

A.dot(B)
array([[35, 44],
       [44, 56]])

我只关心得到A.dot(B).diagonal() = array([35, 56])

有没有一种方法可以array([35, 56])不用计算所有行和列的内积?即ith rowwith的内积ith column

我问是因为对于较大的矩阵,性能差异变得更加显着。

4

2 回答 2

5

这只是二维数组的矩阵乘法:

C[i, j] = sum(A[i, ] * B[, j])

所以既然你只想要对角线元素,看起来你在追求

sum(A[i, ] * B[, i]) # for each i

所以你可以只使用列表理解:

[np.dot(A[i,:], B[:, i]) for i in xrange(A.shape[0])]
# [22, 64]

或者,(这只是因为你想要 adiagonal所以这假设如果 A 的尺寸是n x m,B 的尺寸将是m x n):

np.sum(A * B.T, axis=1)
# array([22, 64])

(这里没有花哨的 numpy 技巧,只是玩数学)。

于 2012-11-20T01:04:12.330 回答
0

您可以简单地省略您不关心的参数中的行吗?

2x3 x 3x2 为您提供 2x2 结果。

一个 1x3 x 3x2 矩阵只会给你 [A][B] 的第一行,一个 1x2 矩阵。

编辑:误读了这个问题。尽管如此,矩阵中的每个值都是由一列和一行转置的乘积产生的。

于 2012-11-20T01:02:34.290 回答