numpy.matmul#
-
numpy.matmul(x1, x2, /, out=None, *, casting='same_kind', order='K', dtype=None, subok=True[, сигнатура, оси, ось]) =
'matmul'> # Матричное произведение двух массивов.
- Параметры:
- x1, x2array_like
Входные массивы, скаляры не допускаются.
- выходndarray, необязательно
Место, в которое сохраняется результат. Если предоставлено, оно должно иметь форму, соответствующую сигнатуре (n,k),(k,m)->(n,m). Если не предоставлено или None, возвращается вновь выделенный массив.
- **kwargs
Для других аргументов, доступных только по ключевым словам, смотрите документация ufunc.
- Возвращает:
- yndarray
Матричное произведение входных данных. Это скаляр только когда оба x1, x2 являются 1-мерными векторами.
- Вызывает:
- ValueError
Если последнее измерение x1 не имеет того же размера, что и предпоследнее измерение x2.
Если передано скалярное значение.
Смотрите также
vecdotКомплексно-сопряжённое скалярное произведение для стеков векторов.
matvecМатрично-векторное произведение для стеков матриц и векторов.
vecmatВекторно-матричное произведение для стеков векторов и матриц.
tensordotСуммировать произведения по произвольным осям.
einsumСоглашение суммирования Эйнштейна.
dotальтернативное матричное произведение с другими правилами широковещания.
Примечания
Поведение зависит от аргументов следующим образом.
Если оба аргумента двумерные, они умножаются как обычные матрицы.
Если любой из аргументов N-D, N > 2, он обрабатывается как стек матриц, находящихся в последних двух индексах, и транслируется соответствующим образом.
Если первый аргумент одномерный, он преобразуется в матрицу путём добавления 1 к его размерностям. После матричного умножения добавленная 1 удаляется. (Для наборов векторов используйте
vecmat.)Если второй аргумент одномерный, он преобразуется в матрицу путем добавления 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 реализует семантику
@оператор, определённый в PEP 465.Он использует оптимизированную библиотеку BLAS, когда это возможно (см.
numpy.linalg).Примеры
Для 2-D массивов это матричное произведение:
>>> 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-D, смешанного с 1-D, результат обычный.
>>> 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])
Трансляция (broadcasting) является стандартной для стеков массивов
>>> 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 ...
The
@оператор может использоваться как сокращение дляnp.matmulна ndarrays.>>> x1 = np.array([2j, 3j]) >>> x2 = np.array([2j, 3j]) >>> x1 @ x2 (-13+0j)