Эффективно вычислять несколько точечных продуктов с numpy - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь эффективно вычислить многие точечные продукты. Этот пост очень близко подходит к тому, что я пытаюсь сделать, но я не могу заставить его работать. У меня есть большой список матриц (а) и список векторов (б). Я хочу сделать серию операций с точечным продуктом между ними. Вот что работает сейчас:

import numpy as np
a # shape (15000,4,4)
b # shape (15000,4)

out = np.empty((15000,4))

for i in range(15000):
    out[i] = np.dot(a[i],b[i])

Все мои попытки адаптировать np.tensordot или np.einsum из связанного поста не дали мне то, что я хочу. Если кто-нибудь увидит, как это сделать, я буду очень признателен.

1 Ответ

0 голосов
/ 23 января 2020

Суммирование Эйнштейна работает просто отлично:

>>> a = np.random.randn(100, 4, 4)
>>> b = np.random.randn(100, 4)
>>> foo = np.einsum('ijk,ik->ij', a, b)
>>> bar = np.zeros_like(foo)
>>> for i, (ai, bi) in enumerate(zip(a, b)):
        bar[i] = np.dot(ai, bi)
>>> np.allclose(foo, bar)
True

Чтобы немного пояснить суммирование, обратите внимание, что вы сжимаете last ось b. Таким образом, вы можете думать о выполнении каждого внутреннего продукта, как если бы np.einsum('jk,k->j', a[0], b[0]) Но мы делаем по одному для каждого элемента a и b, таким образом, включается первая ось, которая не сокращена. Следовательно, ijk,ik->ij.

...