numpy矩阵向量乘法

use*_*574 167 python arrays numpy vector matrix

当我将两个numpy数组(nxn)*(nx 1)相乘时,得到一个大小为(nxn)的矩阵.遵循正常的矩阵乘法规则,期望一个(nx 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]]
Run Code Online (Sandbox Code Playgroud)

我想要的是:

print a*b
   >>
   [16 6 8]
Run Code Online (Sandbox Code Playgroud)

wfl*_*nny 266

最简单的解决方案

使用numpy.dota.dot(b).请参阅此处的文档.

>>> 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])
Run Code Online (Sandbox Code Playgroud)

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


其他方案

还知道还有其他选择:


边缘情况的Rarer选项

  • 如果您有张量(维数大于或等于1的数组),则可以使用numpy.tensordot可选参数axes=1:

    >>> np.tensordot(a, b, axes=1)
    array([16,  6,  8])
    
    Run Code Online (Sandbox Code Playgroud)
  • numpy.vdot如果您有一个复数矩阵,请不要使用,因为矩阵将被展平为一维数组,然后它会尝试找到展平矩阵和矢量之间的复共轭点积(由于尺寸不匹配而失败)n*mvs n).

  • 对于后来发现这个的人来说,numpy支持矩阵乘法运算符`@`. (21认同)
  • IMP 注意:应避免使用 numpy 矩阵,而应使用数组。文档注释 --> “不再建议使用此类,即使对于线性代数也是如此。而是使用常规数组。将来可能会删除该类。” 另请参阅 stackoverflow.com/a/61156350/6043669 (5认同)
  • 优秀的答案wflynny (2认同)