如何理解这个np.einsum('kij',A)的结果?

时间:2015-10-20 08:42:36

标签: python numpy numpy-broadcasting numpy-einsum

例如,

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 个答案:

答案 0 :(得分:2)

如果只指定一组下标,则这些下标将被解释为输入数组中相对于输出的维度顺序,而不是相反。< / p>

例如:

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)