7

我在“np.einsum”的文档中理解的是,一个排列字符串会给出一个向量中轴的排列。以下实验证实了这一点:

>>> M = np.arange(24).reshape(2,3,4)
>>> M.shape
(2, 3, 4)
>>> np.einsum('ijk', M).shape
(2, 3, 4)
>>> np.einsum('ikj', M).shape
(2, 4, 3)
>>> np.einsum('jik', M).shape
(3, 2, 4)

但这我无法理解:

>>> np.einsum('kij', M).shape
(3, 4, 2)

我希望 (4, 2, 3) 改为......我的理解有什么问题?

4

1 回答 1

10

当未指定输出签名时(即'->'下标字符串中没有),einsum将通过获取给定的字母并按字母顺序排列来创建它。

这意味着

np.einsum('kij', M)

实际上相当于

np.einsum('kij->ijk', M)

因此,编写'kij'标签输入矩阵的轴,而不是输出矩阵,这会导致您观察到的轴的排列。

这一点在文档中没有明确说明,但可以在C 源代码中einsum看到注释:

/*
 * If there is no output signature, create one using each label
 * that appeared once, in alphabetical order
 */

为确保 的轴M按预期顺序排列,可能需要为einsum输入和输出矩阵提供标签:

>>> np.einsum('ijk->kij', M).shape
(4, 2, 3)
于 2015-01-30T10:07:28.210 回答