numpy矩阵向量乘法

2024-04-18 04:57:35 发布

您现在位置:Python中文网/ 问答频道 /正文

当我把两个大小为(n x n)*(n x 1)的numpy数组相乘时,得到一个大小为(nxn)的矩阵。遵循正规的矩阵乘法规则,需要一个(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]

Tags: 模块程序numpy信息规则np矩阵数组
1条回答
网友
1楼 · 发布于 2024-04-18 04:57:35

最简单解

使用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数组不是矩阵,并且标准操作*, +, -, /是按数组的顺序进行的。相反,您可以尝试使用^{},并且*将被视为矩阵乘法。


其他解决方案

还要知道还有其他选择:

  • 如下面所述,如果使用python3.5+的话,@操作符将按您的预期工作:

    >>> print(a @ b)
    array([16, 6, 8])
    
  • 如果你想过度杀戮,你可以使用^{}。文档将为您介绍它的工作原理,但老实说,直到阅读this answer并独自使用它,我才完全理解如何使用它。

    >>> np.einsum('ji,i->j', a, b)
    array([16, 6, 8])
    
  • 截至2016年年中(numpy 1.10.1),您可以尝试实验性的^{},其工作方式与numpy.dot类似,但有两个主要的例外:没有标量乘法,但它可以与一堆矩阵一起工作。

    >>> np.matmul(a, b)
    array([16, 6, 8])
    
  • ^{}的功能与矩阵向量乘法的numpy.dot相同,但对于矩阵矩阵和张量乘法的功能不同(关于the inner product and dot product之间的一般差异或see this SO answer关于numpy实现的差异,请参见维基百科)。

    >>> 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]])
    

边缘情况的较少见选项

  • 如果有张量(维度大于或等于1的数组),则可以将^{}与可选参数axes=1一起使用:

    >>> np.tensordot(a, b, axes=1)
    array([16,  6,  8])
    
  • 不要使用^{}如果有复数矩阵,因为矩阵将被展平为1D数组,那么它将尝试在展平矩阵和向量之间找到复数共轭点积(这将由于大小不匹配而失败)。

相关问题 更多 >