2016-12-15 3 views
2

Есть ли способ в NumPy сделать следующее (или есть общий математический термин для этого):Numpy: Dot продукт с максимальным вместо суммы

Пусть нормальное скалярное произведение:

M3[i,k] = sum_j(M1[i,j] * M2[j,k]) 

Теперь я хотел бы заменить сумму на сумму другой операции, скажем, максимум:

M3[i,k] = max_j(M1[i,j] * M2[j,k]) 

Как вы можете видеть, что это полностью параллельно выше, просто мы берем max над всем j а не сумма.

Другие варианты могут быть min, prod и любая другая операция, которая превращает последовательность/значение в значение.

+0

Из любопытства: Кто-нибудь знает, если есть специальный математический термин для такого рода обобщения? Возможно, проблема была изучена с точки зрения оптимизации ... –

+1

'dot' - это операция« суммы продуктов ». Существует запрос 'issue' для обобщения' np.einsum', который позволит пользователю указать обе операции. В собственном продукте Iverson 'APL' написано как« A +. × B », а другие операторы могут использоваться на месте' + 'и' x'. – hpaulj

ответ

4

Нормальная точка продукт будет (с использованием Numpy вещания)

M3 = np.sum(M1[:, :, None] * M2[None, :, :], axis = 1)

Вы можете сделать то же самое с любой функцией, которую вы хотите, что имеет axis ключевое слово.

M3 = np.max(M1[:, :, None] * M2[None, :, :], axis = 1)

+0

Или просто: 'np.max (M1 [..., None] * M2, axis = 1)' и так далее. – Divakar

+0

Будет ли первая строка кода намного медленнее, чем 'np.dot (M1, M2)'? –

+1

@RadioControlled 'np.dot' - это особый случай, и AFAIK не выполняет элементарное умножение и суммирование, поэтому да' np.dot' будет намного быстрее. – Divakar

Смежные вопросы