2016-01-21 6 views
2

У меня есть матрица A формы (n, n) и другая матрица b формы (p, n). Мне нужно, чтобы получить матрицу С, чтоИспользование einsum без явной репликации

C[i] = (A * b[i, np.newaxis, :]) * b[i, :, np.newaxis] 

В настоящее время я делаю что делает np.matlib.repmat (A), а затем с помощью np.einsum следующего

A1 = np.matlib.repmat(A, p, 1).reshape(p, n, n) 
C = np.einsum('ijk, ij..., ik... -> ijk', A1, b, b) 

Но я могу что создание А1 является пустой тратой ресурсов, поскольку она использует одни и те же значения снова и снова. В любом случае я могу это сделать без создания промежуточной матрицы A1?

ответ

2

Использование np.einsum как так -

np.einsum('ij,kij,kij->kij',A,b[:,None,:],b[...,None]) 
+0

Спасибо так много! – Aditya369

+0

Чтобы суммировать его по оси 1, мне просто нужно использовать «ij, kij, kij -> kj» справа? – Aditya369

+0

@ Aditya369 Правильно! – Divakar

Смежные вопросы