Учитывая трехмерный массив X
с размерами (K,n,m
), который можно рассматривать как стопку K
(n,m
) матриц, и одномерный вектор b
(dim n
), цель состоит в том, чтобы получить результирующий вектор r
(dim n
), каждый компонент которого рассчитывается как:
Легко видеть, что выражение под k
-суммированием (т.е. две внутренние суммы) есть просто скалярное произведение X_k b X_k
(и, следовательно, легко вычисляется с помощью numpy
). Итак, искомый вектор r
равен
где X_k
— k
-й 2d (n,m
) «слой» 3d-массива X
.
т.е. текущее решение
r = 0
for k in range(K):
r += x[k,:,:] @ (b @ x[k, :, :])
Можно ли эффективно вычислить r
, избегая цикла for, с помощью k
?
Или, может быть, есть другой эффективный способ расчета r
?
(Я пробовал np.tensordot
, но так как это просто суммирование по k
, я еще не получил правильного результата.)
Это выглядит как идеальный вариант использования для эйнсум:
r = np.einsum('kij,l,klj->i', x, b, x)
который будет векторизовать операцию, например. это более оптимально, чем цикл for.