numpy.matmul#

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

兩個陣列的矩陣乘積。

參數:
x1, x2array_like

輸入陣列,不允許純量。

outndarray, 選填

儲存結果的位置。如果提供,其形狀必須符合簽名 (n,k),(k,m)->(n,m)。如果未提供或為 None,則會回傳一個新分配的陣列。

**kwargs

關於其他僅限關鍵字參數,請參閱 ufunc 文件

回傳值:
yndarray

輸入的矩陣乘積。僅當 x1、x2 都是 1 維向量時,此值為純量。

拋出:
ValueError

如果 x1 的最後一個維度與 x2 的倒數第二個維度大小不同。

如果傳入純量值。

另請參閱

vecdot

向量堆疊的複共軛點積。

matvec

矩陣和向量堆疊的矩陣向量乘積。

vecmat

向量和矩陣堆疊的向量矩陣乘積。

tensordot

任意軸上的總和乘積。

einsum

愛因斯坦求和約定。

dot

具有不同廣播規則的替代矩陣乘積。

註解

行為取決於以下列方式的引數。

  • 如果兩個引數都是 2 維的,則它們像傳統矩陣一樣相乘。

  • 如果任一引數是 N 維的,N > 2,則它被視為駐留在最後兩個索引中的矩陣堆疊,並相應地廣播。

  • 如果第一個引數是 1 維的,則透過在其維度前置 1 將其提升為矩陣。在矩陣乘法之後,前置的 1 會被移除。(對於向量堆疊,請使用 vecmat。)

  • 如果第二個引數是 1 維的,則透過在其維度後置 1 將其提升為矩陣。在矩陣乘法之後,後置的 1 會被移除。(對於向量堆疊,請使用 matvec。)

matmuldot 在兩個重要方面有所不同

  • 不允許與純量相乘,請改用 *

  • 矩陣堆疊會像矩陣是元素一樣一起廣播,並遵守簽名 (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 中引入的 @ 運算子的語義,遵循 PEP 465

它在可能的情況下使用最佳化的 BLAS 函式庫(請參閱 numpy.linalg)。

範例

對於 2 維陣列,它是矩陣乘積

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

對於 2 維混合 1 維,結果是通常的結果。

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

向量、向量回傳純量內積,但兩個引數都不是複共軛的

>>> 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 ...

@ 運算子可以用作 ndarray 上 np.matmul 的簡寫。

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