Мне нужно вычислить точечный продукт для N строк; Скажем, для каждой строки мне нужно вычислить 1xM раз MxM раз Mx1. Если бы я смотрел только на одну строку, у меня было бы 1x1 из этого расчета. У меня есть N строк, поэтому я подумал, что я буду складывать строки и передавать их в dot-продукт; Однако в результате получается матрица NxN. Результаты, которые мне нужны, находятся в диагонали, но есть ли более быстрый способ сделать это вычисление, которое также не теряет пространства? В идеале я бы хотел в итоге получить вектор Nx1, а не матрицу NxN.Эффективно вычислять 1xM Times MxM Times Mx1, N Times
Пример
Однорядные
r = np.array([[1,2]]).T
R = np.array([[2,2],[2,2]])
дает
[[18]]
нескольких строк
rs = np.array([[1,2],[4,4]]).T
R = np.array([[2,2],[2,2]])
print np.dot(np.dot(rs.T,R), rs)
[[ 18 48]
[ 48 128]]
На моей машине, мой три-аргумент einsum фактически в десять раз медленнее, чем при использовании вашего подхода на больших массивах. (diag 7,4 мс, einsum + точка = 3,6, 3-einsum = 73,2). Жаль, мне понравилось ..: -/ – DSM
@DSM Да, мне тоже понравилось, чтобы все, что было в 'einsum', было хорошей работой, я думал! Восстановить его, может быть, людям могут нравиться альтернативы? :) – Divakar