首页 文章

numpy矩阵向量乘法[重复]

提问于
浏览
116

这个问题在这里已有答案:

当我乘以两个大小(n×n)*(n×1)的numpy数组时,得到一个大小为(n×n)的矩阵 . 遵循正常的矩阵乘法规则,期望一个(n x 1)向量,但我根本无法找到有关如何在Python的Numpy模块中完成此操作的任何信息 .

问题是我不想手动实现它以保持程序的速度 .

示例代码如下所示:

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

print a*b
   >>
   [[5 2 9]
   [1 2 3]
   [1 4 3]]

我想要的是:

print a*b
   >>
   [16 6 8]

1 回答

  • 192

    最简单的解决方案

    使用 numpy.dota.dot(b) . 请参阅文档here .

    >>> a = np.array([[ 5, 1 ,3], 
                      [ 1, 1 ,1], 
                      [ 1, 2 ,1]])
    >>> b = np.array([1, 2, 3])
    >>> print a.dot(b)
    array([16, 6, 8])
    

    这是因为numpy数组不是矩阵,并且标准操作 *, +, -, / 在数组上按元素方式工作 . 相反,您可以尝试使用numpy.matrix* 将被视为矩阵乘法 .


    其他解决方案

    还知道还有其他选择:

    • 如下所述,如果使用python3.5, @ 运算符可以按预期工作:
    >>> print(a @ b)
    array([16, 6, 8])
    
    • 如果你想要矫枉过正,你可以使用numpy.einsum . 文档将为您提供一个如何工作的风格,但老实说,我还没有完全理解如何使用它,直到阅读this answer并且只是自己玩它 .
    >>> np.einsum('ji,i->j', a, b)
    array([16, 6, 8])
    
    • 截至2016年中期(numpy 1.10.1),您可以尝试实验numpy.matmul,其工作方式类似于 numpy.dot ,但有两个主要的例外:没有标量乘法,但它适用于矩阵堆栈 .
    >>> np.matmul(a, b)
    array([16, 6, 8])
    
    >>> np.inner(a, b)
    array([16, 6, 8])
    
    # Beware using for matrix-matrix multiplication though!
    >>> b = a.T
    >>> np.dot(a, b)
    array([[35,  9, 10],
           [ 9,  3,  4],
           [10,  4,  6]])
    >>> np.inner(a, b) 
    array([[29, 12, 19],
           [ 7,  4,  5],
           [ 8,  5,  6]])
    

    边缘情况的Rarer选项

    • 如果您有张量(维数大于或等于1的数组),则可以将numpy.tensordot与可选参数 axes=1 一起使用:
    >>> np.tensordot(a, b, axes=1)
    array([16,  6,  8])
    
    • Don't use numpy.vdot 如果您有一个复数矩阵,因为矩阵将被展平为一维数组,那么它将尝试找到您的展平矩阵和向量之间的复共轭点积(由于大小不匹配而失败 n*m vs n ) .

相关问题