上一主题

numpy.outer

下一主题

numpy.tensordot

numpy.matmul

numpy.matmul(a, b, out=None)

两个数组的矩阵乘积。

行为取决于参数以下面的方式。

  • 如果两个参数都是2-D,则它们像常规矩阵一样相乘。
  • 如果任一参数是N-D,N> 2,则将其视为存在于最后两个索引中的矩阵的堆栈并且相应地进行广播。
  • 如果第一个参数是1-D,则通过在其维度前面添加1来将其提升为矩阵。在矩阵乘法之后,去除前缀1。
  • 如果第二个参数是1-D,则通过向其维度添加1来将其提升为矩阵。在矩阵乘法之后,去除附加的1。

不允许乘以标量乘法,请改用*注意,将一堆矩阵乘以一个向量将产生一个向量栈,但是matmul不会这样认出它。

matmul与两个重要方面不同于dot

  • 不允许乘以标量乘法。
  • 矩阵的栈被一起广播,如同矩阵是元素一样。

警告

此功能是初步的,包括在Numpy 1.10中用于测试和文档。它的语义不会改变,但可选参数的数量和顺序将会改变。

版本1.10.0中的新功能。

参数:

a:array_like

第一个参数。

b:array_like

第二个参数。

out:ndarray,可选

输出参数。这必须有返回的确切的类型,如果没有使用。特别地,它必须具有正确的类型,必须是C连续的,并且其dtype必须是将为dot(a,b)返回的dtype。这是一个性能特性。因此,如果不满足这些条件,则引发异常,而不是试图灵活。

返回:

输出:ndarray

返回ab的点积。如果ab都是1-D数组,则返回标量;否则返回一个数组。如果给出out,则返回。

上升:

ValueError

如果a的最后一个尺寸与b的倒数第二个尺寸不同。

如果标量值被传递。

也可以看看

vdot
复共轭点积。
tensordot
任意轴上的和。
einsum
爱因斯坦求和约定。
dot
具有不同广播规则的替代矩阵产品。

笔记

matmul函数实现了在PEP465之后的Python 3.5中引入的@运算符的语义。

例子

对于2-D数组,它是矩阵积:

>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.matmul(a, b)
array([[4, 1],
       [2, 2]])

对于与1-D混合的2-D,结果是通常的。

>>> a = [[1, 0], [0, 1]]
>>> b = [1, 2]
>>> np.matmul(a, b)
array([1, 2])
>>> np.matmul(b, a)
array([1, 2])

广播对于数组的栈是常规的

>>> a = np.arange(2*2*4).reshape((2,2,4))
>>> b = np.arange(2*2*4).reshape((2,4,2))
>>> np.matmul(a,b).shape
(2, 2, 2)
>>> np.matmul(a,b)[0,1,1]
98
>>> sum(a[0,1,:] * b[0,:,1])
98

Vector,vector返回标量内积,但两个参数都不是复共轭:

>>> np.matmul([2j, 3j], [2j, 3j])
(-13+0j)

标量乘法会引发错误。

>>> np.matmul([1,2], 3)
Traceback (most recent call last):
...
ValueError: Scalar operands are not allowed, use '*' instead