NumPy состав Einsums?
Предположим, что у меня есть np.einsum
который выполняет некоторые вычисления, а затем закачивает это непосредственно в еще один np.einsum
сделать что-то другое. Могу ли я вообще составить эти два einsum
в один einsum
?
Мой конкретный вариант использования заключается в том, что я делаю транспонирование, умножение матриц, а затем еще одно умножение матриц для вычисления b a^T a
:
import numpy as np
from numpy import array
a = array([[1, 2],
[3, 4]])
b = array([[1, 2],
[3, 4],
[5, 6]])
matrix_multiply_by_transpose = 'ij,kj->ik'
matrix_multiply = 'ij,jk->ik'
test_answer = np.einsum(matrix_multiply,
np.einsum(matrix_multiply_by_transpose,
b, a
),
a
)
assert np.array_equal(test_answer,
np.einsum(an_answer_to_this_question, b, a, a))
#or, the ultimate most awesomest answer ever, if such a thing even exists
assert np.array_equal(test_answer,
np.einsum(the_bestest_answer(matrix_multiply_by_transpose, matrix_multiply),
b, a, a)
)
1 ответ
Решение
В одиночку einsum
позвони, было бы -
np.einsum('ij,kj,kl->il',b,a,a)
Интуиция включала бы:
- Начните с самого внутреннего
einsum
вызов:'ij,kj->ik'
, - Выйдя, второй:
'ij,jk->ik'
, Первым аргументом в этом является вывод изstep#1
, Итак, давайте сформируем этот аргумент для второго на основе вывода первого, введя новые строки для новых итераторов:'ik,kl->il'
, Обратите внимание, что'kl'
это второй аргумент в этом второмeinsum
вызов, которыйa
,
Таким образом, объединяя, мы имеем: 'ij,kj,kl->il'
с входами в той же последовательности, т.е. b,a
для самого внутреннего einsum
позвони, а затем a
входящий в качестве третьего входа.