numpy.matmul

numpy.matmul(x1, x2, /, out=None, *, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'matmul'>

两个数组的矩阵积。

参数
X1,X2array_like

输入数组,不允许使用标量。

outndarray,可选

存储结果的位置。如果提供,它必须具有与签名匹配的形状 (n,k),(k,m)->(n,m) . 如果未提供或没有,则返回新分配的数组。

**kwargs

有关其他仅限关键字的参数,请参见 ufunc docs .

1.16 新版功能: 现在处理UFunc Kwargs

返回
y恩达雷

输入的矩阵积。只有当x1,x2都是一维向量时,这才是一个标量。

加薪
ValueError

如果的最后一个维度 x1 与的第二个到最后一个维度的大小不同 x2 .

如果传入了一个标量值。

参见

vdot

复共轭点积。

tensordot

任意轴上的和积。

einsum

爱因斯坦求和约定。

dot

具有不同广播规则的替代矩阵产品。

笔记

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

  • 如果两个参数都是二维的,它们会像传统的矩阵那样相乘。

  • 如果其中一个参数是n-d,n>2,则将其视为位于最后两个索引中的矩阵堆栈,并相应地进行广播。

  • 如果第一个参数是一维的,则通过在其维前面加1,将其提升为矩阵。矩阵相乘后,将删除预先结束的1。

  • 如果第二个参数是一维的,则通过在其维度上附加1,将其提升为矩阵。矩阵相乘后,去掉附加的1。

matmul 不同于 dot 在两个重要方面:

  • 不允许用标量乘法,请使用 * 相反。

  • 矩阵叠放在一起,就像矩阵是元素一样,考虑到签名。 (n,k),(k,m)->(n,m)

    >>> a = np.ones([9, 5, 7, 4])
    >>> c = np.ones([9, 5, 4, 3])
    >>> np.dot(a, c).shape
    (9, 5, 7, 9, 5, 3)
    >>> np.matmul(a, c).shape
    (9, 5, 7, 3)
    >>> # n is 7, k is 4, m is 3
    

matmul函数实现了 @ 在python 3.5中引入了一个运算符,它遵循pep465。

实例

对于二维数组,它是矩阵积:

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

对于二维与一维混合的情况,结果是通常的。

>>> a = np.array([[1, 0],
...               [0, 1]])
>>> b = np.array([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: matmul: Input operand 1 does not have enough dimensions ...

这个 @ 运算符可用作 np.matmul 在星期天。

>>> x1 = np.array([2j, 3j])
>>> x2 = np.array([2j, 3j])
>>> x1 @ x2
(-13+0j)

1.10.0 新版功能.