【问题标题】:numpy matrix multiplication row-wisenumpy矩阵乘法逐行
【发布时间】:2017-10-29 05:11:35
【问题描述】:

我有一个矩阵,比如

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

我想得到一个新矩阵,其中每个元素都是 a 的行与其自身的矩阵乘积:

np.array([
    np.dot(np.array([a[0]]).T, np.array([a[0]])),
    np.dot(np.array([a[1]]).T, np.array([a[1]])),
    np.dot(np.array([a[2]]).T, np.array([a[2]])),
    np.dot(np.array([a[3]]).T, np.array([a[3]])),
])

这将是一个 4x4 矩阵,每个元素都是一个 3x3 矩阵。 之后,我可以对 0 轴求和,得到一个新的 3x3 矩阵。

除了使用循环之外,还有其他更优雅的方式来实现吗?

【问题讨论】:

    标签: python numpy matrix multiplication


    【解决方案1】:

    使用NumPy broadcasting 保持第一个轴对齐并在第二个轴之间执行外积-

    a[:,:,None]*a[:,None,:] # or a[...,None]*a[:,None]
    

    使用np.einsum,转换为-

    np.einsum('ij,ik->ijk',a,a)
    

    【讨论】:

    • 如果你看到我删除的答案,我就成功了!下次我会做对的,谢谢你的回答。 :)
    • @cᴏʟᴅsᴘᴇᴇᴅ 是的,你已经接近了! :)
    • 非常感谢!!我试过了,这正是我想要的。永远不要想象广播可以通过这种方式完成。
    • 我点击了检查标志,这样可以吗?顺便说一句:如果我有另一个长度为 4 的一维数组,如何将此一维数组与上述结果数组相乘?
    • 我明白了。 AA * b[:, None, None] 会这样做。 @Divakar
    【解决方案2】:

    我可能遗漏了一些东西,但这不只是矩阵乘法吗?

    >>> a.T @ a
    array([[30, 40, 50],
           [40, 54, 68],
           [50, 68, 86]])
    
    >>> np.sum(np.array([
          np.dot(np.array([a[0]]).T, np.array([a[0]])),
          np.dot(np.array([a[1]]).T, np.array([a[1]])),
          np.dot(np.array([a[2]]).T, np.array([a[2]])),
          np.dot(np.array([a[3]]).T, np.array([a[3]])),
        ]), axis=0)
    array([[30, 40, 50],
           [40, 54, 68],
           [50, 68, 86]])
    

    【讨论】:

    • 您好,percusse,感谢您的评论,但不,它们不一样。我正在计算类似 [1, 2, 3].T * [1, 2, 3] = [[1, 2, 3], [2, 4, 6], [3, 6, 9]] 的东西,但是你计算的是 [1, 2, 3] * [1, 2, 3].T = [14].
    • @JQK 我刚刚复制了你的代码并比较了结果。
    • 是的,您似乎是正确的,但我还没有时间检查它。谢谢您的帮助。
    • 对不起,我记得。昨天做的时候,我需要将矩阵乘以一些权重,然后求和。可以将权重移到原始数组中,然后使用矩阵乘法。无论如何,谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 2021-02-19
    • 2017-03-04
    • 2019-11-23
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多