np.matmul() в NumPy

Матричное умножение многомерных массивов: np.matmul() в NumPy

В мире научных вычислений и линейной алгебры матричные операции являются одними из самых фундаментальных. Одной из таких операций является матричное умножение. В NumPy это можно сделать с помощью функции np.matmul(). Разберем, что стоит за "matrix multiplication".

Синтаксис

numpy.matmul(a, b, out=None)

где:

  • a, b - входные массивы.
  • out - необязательный параметр. Если предоставлен, то это должен быть массив в который будет записан результат. Должен иметь форму, соответствующую формам входных массивов.

Различия между np.dot() и np.matmul()

В некоторых контекстах функции 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 для выполнения матричного умножения. Он позволяет эффективно работать с матрицами различных размерностей и находит широкое применение в различных научных и инженерных задачах.

Содержание: