Как понять результат этого 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)
Другие вопросы по тегам