В матрице MATLAB умножение является нормой, используя *
.Элементное умножение использует оператор .*
.Также матрицы имеют как минимум 2d.
In numpy
, для поэлементного умножения используется *
.Умножение матриц выполняется с помощью np.dot
(или его метода), а в последнее время - с помощью оператора @
(np.matmul
).numpy
добавляет широковещательную передачу, которая придает умножению по элементам намного большую выразительность.
С вашими 2 примерами массивов формы (3,) и (4,) можно создать (3,4) outer product
https://en.wikipedia.org/wiki/Outer_product включает в себя:
np.outer(a,b)
np.einsum('i,j->ij, a, b) # matching einstein index notation
a[:,None] * b # the most idiomatic numpy expression
Последнее работает из-за вещания.a[:, None]
, подобно a.reshape(-1,1)
, превращает массив (3,) в (3,1).b[None, :]
превращает (4,) в (1,4).Но вещание может выполнить это обновление автоматически (и однозначно).
(3,1) * (4,) => (3,1) * (1,4) => (3,4)
Вещание не работает с np.dot
.Поэтому нам нужно
a[:, None].dot(b[None, :]) # (3,1) dot with (1,4)
Ключ с dot
состоит в том, что последний дим из a
пар со вторым до последнего из b
.(np.dot
также работает с 2 совпадающими одномерными массивами, выполняя обычное произведение векторов-точек).
@
(matmul
) представляет оператор, который работает как dot
, по крайней мере, в 2d с2-й случай.С массивами более высокой размерности они работают по-разному.
a[:,None].dot(b[None,:])
np.dot(a[:,None], b[None,:])
a[:,None] @ b[None,:]
a[:,None] @ b[:,None].T
и эквиваленты reshape
создают требуемый (3,4) массив.
np.tensordot
может обрабатывать комбинации других размеров, но работает путем изменения формы и транспонирования входных данныхтак что в итоге он может передать их dot
.Затем он преобразует результат обратно в желаемую форму.
Быстрые временные тесты показывают, что версии np.dot
имеют тенденцию быть самыми быстрыми - потому что они делегируют действие быстрым BLAS-подобным библиотекам.Для других версий делегирование немного более косвенное, либо они используют numpy's
собственный скомпилированный код.