Как понять результат этого np.einsum('kij',A)?
Например,
A = np.arange(24).reshape((2, 3, 4))
print np.einsum('ijk', A)
это все еще A
без проблем.
Но если я сделаю print np.einsum('kij', A)
форма (3, 4, 2)
, Не должно ли это быть (4, 2, 3)
?
Результат print np.einsum('cab', A)
форма (4, 2, 3)
без проблем тоже. Почему print np.einsum('kij', A)
не то же самое?
1 ответ
Решение
Если вы укажете только один набор индексов, они будут интерпретированы как порядок измерений во входном массиве относительно вывода, а не наоборот.
Например:
import numpy as np
A = np.arange(24).reshape((2, 3, 4))
B = np.einsum('kij', A)
i, j, k = np.indices(B.shape)
print(np.all(B[i, j, k] == A[k, i, j]))
# True
Как отметил @hpaulj в комментариях, вы можете сделать соответствие между входными и выходными измерениями более явным, указав оба набора индексов:
# this is equivalent to np.einsum('kij', A)
print(np.einsum('kij->ijk', A).shape)
# (3, 4, 2)
# this is the behavior you are expecting
print(np.einsum('ijk->kij', A).shape)
# (4, 2, 3)