Повышение A
до массива формы (2,2,1), затем NumPy широковещание сделает все остальное:
ahat -= A[..., None]
A[..., None]
эквивалентно A[..., np.newaxis]
.Добавляет новую ось длины 1 в массив.Поскольку ahat
имеет форму (2,2,100), а A[..., None]
имеет форму (2,2,1), трансляция NumPy приведет оба массива к совместимой форме (2,2100) (но с эффективным использованием памяти, без фактического копирования значений из A
в больший массив).
В более общем смысле, обратите внимание, что трансляция NumPy автоматически добавит новые оси к левой стороне формы любого массива NumPy.Так, например, с любой базовой арифметической операцией NumPy, такой как сложение или умножение, A
будет автоматически транслироваться в форму, подобную (1,2,2), если другой массив, участвующий в арифметической операции, будет 3-мерным (иличетный (1,1,2,2), если другой массив был 4-мерным).Выше нам потребовалось A[..., None]
, чтобы явно добавить новую ось, поскольку мы хотели, чтобы новая ось находилась с правой стороны фигуры.
Для умножения матриц вы обычно используете np.dot
, или np.einsum
, или np.tensordot
.Некоторые из этих функций, такие как np.einsum
и np.tensordot
, позволяют вам указать, какие оси вы хотите использовать в умножении матриц (поэтому вам не нужно явно добавлять новые оси).Например, чтобы умножить матрицу ahat
и A
, вы можете использовать
np.tensordot(ahat, A, axes=[[1], [0]])
или
np.einsum('ijk,jl->ikl', ahat, A)
Это умножает значения вдоль оси 1 ahat
на значениявдоль оси 0 A
, а затем суммы для продуктов.