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

Python 如何理解这个np.einsum('kij',A')的结果?,python,numpy,array-broadcasting,numpy-einsum,Python,Numpy,Array Broadcasting,Numpy Einsum,比如说, A = np.arange(24).reshape((2, 3, 4)) print np.einsum('ijk', A) 这仍然是一个没有问题的问题 但是如果我打印np.einsum'kij',A的形状是3,4,2。不是应该是4,2,3吗 打印np.einsum'cab'的结果是,形状为4、2、3,也没有问题。为什么print np.einsum'kij',A不一样?如果只指定一组下标,这些下标将被解释为输入数组中相对于输出的维度顺序,反之亦然 例如: import numpy

比如说,

A = np.arange(24).reshape((2, 3, 4))
print np.einsum('ijk', A)
这仍然是一个没有问题的问题

但是如果我打印np.einsum'kij',A的形状是3,4,2。不是应该是4,2,3吗


打印np.einsum'cab'的结果是,形状为4、2、3,也没有问题。为什么print np.einsum'kij',A不一样?

如果只指定一组下标,这些下标将被解释为输入数组中相对于输出的维度顺序,反之亦然

例如:

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)

你的意思一定是A=np.arange2.reforme2,3,4也是np.einsum'cab',A.shape==3,4,2,而不是4,2,3我用kij和cab得到3,4,2。我更喜欢显式的重新排序指令,kij->ijk,或ijk->kij。如果还有一个问题,我可以让你参考几年前我反向设计的纯Python版本。当我使用“cab”时,结果形状是4,2,3,但当我使用“kij”时,结果形状是3,4,2,我认为它们都应该是,2,3我不能复制你使用numpy v1.9.2、v1.8.2或v1.6.0描述的行为。对于np.einsum'kij',A和np.einsum'cab',A,我总是得到一个3,4,2的输出形状。哦,我现在知道我想用'kij'做的事情应该用'ijk->kij'来完成,但是我仍然不明白'kij'做什么,为什么结果是3,4,2..假设你用字母I,j,k来标记数组B的维度。然后,k、i、j中字母的位置指定了从数组A中选择维度以形成数组B的顺序。第一个字母i位于第二个位置,因此B中的第一个维度是A 3中的第二个维度。第二个字母j位于第三个位置,因此B中的第二个维度是A 4中的第三个维度。第三个字母k位于第一个位置,因此B的最终尺寸是A 2的第一个尺寸。这更清楚吗?