Векторизация numpy расчет без тензорного произведения - PullRequest
1 голос
/ 27 апреля 2020

Я хотел бы векторизовать частный случай следующей математической формулы (из Таблицы 2 и Приложения А этой статьи ) с помощью numpy:

Appendix A

Случай, который я хотел бы вычислить, следующий, где коэффициенты масштабирования под квадратом root можно игнорировать.

Table 2

Термин w_kij - w_ij_bar представляет собой матрицу n x p x p , где n обычно намного больше, чем p .

Я реализовал 2 решения, ни одно из которых не особенно хорошо: одно включает двойной l oop, а другое заполняет память ненужными вычислениями очень быстро.

dummy_data = np.random.normal(size=(100, 5, 5))

# approach 1: a double loop
out_hack = np.zeros((5, 5))
for i in range(5):
    for j in range(5):
        out_hack[i, j] = (dummy_data.T[j, j, :]*dummy_data[:, j, i]).sum()

# approach 2: slicing a diagonal from a tensor dot product
out = np.tensordot(dummy_data.T, dummy_data, axes=1)
out = out.diagonal(0, 0, 2).diagonal(0, 0, 2)

print((out.round(6) == out_hack.round(6)).all())
>>> True

Есть ли способ найти золотую середину между этими двумя подходами?

1 Ответ

3 голосов
/ 27 апреля 2020

np.einsum переводит это почти буквально -

np.einsum('kjj,kji->ij',dummy_data,dummy_data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...