В мире научных вычислений и линейной алгебры матричные операции являются одними из самых фундаментальных. Одной из таких операций является матричное умножение. В NumPy это можно сделать с помощью функции np.matmul()
. Разберем, что стоит за "matrix multiplication".
numpy.matmul(a, b, out=None)
где:
a
, b
- входные массивы.out
- необязательный параметр. Если предоставлен, то это должен быть массив в который будет записан результат. Должен иметь форму, соответствующую формам входных массивов.В некоторых контекстах функции np.dot()
и np.matmul()
кажутся похожими, особенно когда речь идет о двухмерных матрицах. Однако между этими функциями есть ключевые различия, особенно при работе с многомерными массивами.
Для двухмерных массивов:
np.dot()
: Выполняет стандартное матричное умножение. Для двух матриц A и B это эквивалентно np.matmul(A, B).np.matmul()
: Точно так же выполняет стандартное матричное умножение для двух матриц.Для многомерных массивов:
np.dot()
: Когда мы умножаем два многомерных массива, np.dot()
суммирует произведения по последней оси первого массива и второй оси второго массива. Результат может иногда быть неожиданным.np.matmul()
: По сути, он выполняет матричное умножение для последних двух измерений каждого массива и "транслирует" результат на предыдущие измерения. Это более предсказуемое и естественное поведение для математических операций с многомерными массивами.Операции с векторами:
np.dot()
: Если оба аргумента являются одномерными массивами, np.dot()
возвращает скалярное произведение векторов.np.matmul()
: При передаче одномерных массивов np.matmul()
также возвращает скалярное произведение, что делает ее поведение схожим с np.dot()
в этом контексте.Другие отличия:
np.dot()
может выполнять внутреннее произведение, матричное умножение и многие другие операции, в зависимости от размерности и формы входных данных. Это делает ее более универсальной, но также может создать путаницу.np.matmul()
более явно фокусируется на матричном умножении, что делает ее поведение более предсказуемым в многих ситуациях.Вывод: Выбор между np.dot()
и np.matmul()
зависит от вашего конкретного применения. Если вы работаете строго с двухмерными матрицами, разница может быть минимальна. Однако при работе с многомерными массивами рекомендуется использовать np.matmul()
из-за ее более предсказуемого поведения в отношении матричных операций.
Простое матричное умножение:
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[2, 0], [1, 3]])
result = np.matmul(A, B)
print(result) # [[4, 6], [10, 12]]
Работа с трехмерными массивами:
A = np.random.rand(2, 3, 3)
B = np.random.rand(2, 3, 3)
result = np.matmul(A, B)
Здесь производится умножение матриц для каждого из "слоев" (первого измерения).
Иногда может потребоваться выполнить матричное умножение для "вложенных" матриц внутри другой матрицы или массива.
A = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
B = np.array([[[2, 0], [1, 3]], [[0, 1], [1, 2]]])
result = np.matmul(A, B)
print(result)
Здесь у нас есть две 2x2 матрицы внутри 2x2x2 массива, и np.matmul()
выполняет умножение для каждой пары "вложенных" матриц.
Матричное умножение часто используется в комбинации с другими матричными операциями, такими как нахождение обратной матрицы. Если A_inv
- это обратная матрица для A
, тогда np.matmul(A, A_inv)
должно дать единичную матрицу.
A = np.array([[1, 2], [3, 4]])
A_inv = np.linalg.inv(A)
print(np.matmul(A, A_inv))
Транспонирование матрицы (переворачивание строк и столбцов) также является частой операцией в комбинации с матричным умножением.
A = np.array([[1, 2], [3, 4]])
B = np.array([[2, 3], [1, 4]])
# Умножаем A на транспонированную матрицу B
print(np.matmul(A, B.T))
np.matmul()
— это мощный инструмент NumPy для выполнения матричного умножения. Он позволяет эффективно работать с матрицами различных размерностей и находит широкое применение в различных научных и инженерных задачах.
Содержание: