【问题标题】:Dot product of ith row with ith column第 i 行与第 i 列的点积
【发布时间】:2012-11-08 00:55:48
【问题描述】:

在 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]) 而无需计算所有行和列的内积? IE。 ith rowith column 的内积?

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

【问题讨论】:

    标签: numpy


    【解决方案1】:

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

    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]
    

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

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

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

    【讨论】:

    • 再次感谢...所以它不如stackoverflow.com/questions/2301046/… 优雅:(
    • 好吧,如果你发现了这个问题,你可以将它直接翻译成 numpy(我一发布答案并将其添加到我的答案中就想到了完全相同的事情)
    • 嗨!这就像一个魅力,但你会为np.diag(A@B) = np.sum(A*B.T , axis=1) 做数学演示吗?
    • 如果有人对数学演示感兴趣,我写了一个问题/答案here on math StackExchange
    【解决方案2】:

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

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

    一个 1x3 x 3x2 矩阵将只为您提供 [A][B] 的第一行,即 1x2 矩阵。

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

    【讨论】:

    • 对不起,我意识到我实际上是在寻找对角线,而不是第一行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2023-04-08
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多