Подход № 1
Мы можем использовать einsum
для покрытия общих ndarrays -
np.einsum('i...,i->i...',A,B)
Трюк, который работает здесь, это ellipsis
, который транслирует для конечных измерений после первой оси, когда они находятся в A
, и сохраняет их на выходе, сохраняя при этом первые оси для двух входов выровненными, что предполагаемое умножение здесь. С A
в качестве массива 1D
вещание отсутствует, и это существенно сокращается до: np.einsum('i,i->i',A,B)
под капотами.
Схематически обозначено:
A : i x ....
B : i
out : i x ....
Следовательно, крышки для A
с любым количеством измерений.
Подробнее об использовании ellipsis
из документации:
Чтобы включить и контролировать вещание, используйте многоточие. По умолчанию
Вещание в стиле NumPy осуществляется путем добавления многоточия слева от
каждый термин, например, np.einsum ('... ii -> ... i', a). Взять след
По первой и последней осям вы можете выполнить np.einsum ('i ... i', a) или сделать
матрично-матричное произведение с крайними левыми индексами вместо крайних правых,
Вы можете сделать np.einsum ('ij ..., jk ...-> ik ...', a, b).
Подход № 2
Используя тот факт, что мы пытаемся выровнять первую ось A
с единственной осью массива 1D B
, мы можем просто транспонировать A
, умножить на B
и, наконец, транспонировать обратно -
(A.T*B).T