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 的倒數第二個維度大小不同。
如果傳入純量值。
另請參閱
註解
行為取決於以下列方式的引數。
如果兩個引數都是 2 維的,則它們像傳統矩陣一樣相乘。
如果任一引數是 N 維的,N > 2,則它被視為駐留在最後兩個索引中的矩陣堆疊,並相應地廣播。
如果第一個引數是 1 維的,則透過在其維度前置 1 將其提升為矩陣。在矩陣乘法之後,前置的 1 會被移除。(對於向量堆疊,請使用
vecmat
。)如果第二個引數是 1 維的,則透過在其維度後置 1 將其提升為矩陣。在矩陣乘法之後,後置的 1 會被移除。(對於向量堆疊,請使用
matvec
。)
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 中引入的
@
運算子的語義,遵循 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)