Я хотел бы векторизовать частный случай следующей математической формулы (из Таблицы 2 и Приложения А этой статьи ) с помощью numpy
:
Случай, который я хотел бы вычислить, следующий, где коэффициенты масштабирования под квадратом root можно игнорировать.
Термин 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
Есть ли способ найти золотую середину между этими двумя подходами?