numpy.matmul
Функция numpy.matmul
также выполняет матричное умножение между двумя массивами, но имеет несколько разных правил для обработки многомерных массивов. Два массива должны иметь одинаковую форму, за исключением последних двух измерений, которые должны совпадать. Если любой из массивов 1-D, то он преобразуется в матрицу путём добавления 1 к его форме.
C = np.matmul(A, B)
print(C)
## Output:
## array([[19, 22],
## [43, 50]])
В этом примере мы получаем тот же результат, что и с numpy.dot
. Это происходит потому, что наши массивы A
и B
имеют одинаковую форму, поэтому numpy.matmul
ведёт себя так же, как numpy.dot
.
И есть ещё один пример:
## определить два 3-D массива
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = np.array([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])
c = np.matmul(a, b)
d = np.dot(a, b)
print(c)
## Output:
## array([[[ 31, 34],
## [ 71, 78]],
## [[155, 166],
## [211, 226]]])
print(d)
## Output:
## array([[[[ 31, 34],
## [ 43, 46]],
## [[ 71, 78],
## [ 99, 106]]],
## [[[111, 122],
## [155, 166]],
## [[151, 166],
## [211, 226]]]])
В этом примере numpy.matmul
выполняет операцию пакетного матричного умножения.
Поскольку и a
, и b
- это 3-D массивы, то выход numpy.dot
будет иметь размерность (2,2,2,2). Первые два измерения соответствуют двум пакетам матриц 2\times2 в a
и b
. Следующие два измерения соответствуют скалярному произведению каждой пары матриц 2\times2 в пакетах:
## первый результат 2 × 2
dot(a[0], b[0]) =
dot([[1, 2],
[3, 4]],
[[9, 10],
[11, 12]]
= [[1*9 + 2*11, 1*10 + 2*12],
[3*9 + 4*11, 3*10 + 4*12]]
= [[31, 34],
[43, 46]]