第i行与第i列的点积

时间:2012-11-20 00:54:37

标签: numpy

在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 rowith column的内在产品?

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

2 个答案:

答案 0 :(得分:3)

这只是2D阵列的矩阵乘法:

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]

OR,(这只是因为你想要一个diagonal,所以这假定如果A的维度为n x m,则B的维度为m x n):

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

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

答案 1 :(得分:0)

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

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

1x3 x 3x2矩阵将只给出[A] [B]的顶行,1x2矩阵。

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