python - numpy einsum 获取轴置换

标签 python arrays numpy transpose numpy-einsum

我在“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) 而不是...我的理解有什么问题吗?

最佳答案

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

这意味着

np.einsum('kij', M)

实际上等同于

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

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

这一点在文档中没有明确说明,但可以在 C source code for 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)

关于python - numpy einsum 获取轴置换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232720/

相关文章:

python - 如何在 python 中使用 zip 和列表理解来展平 2D 列表并添加分隔符?

python - 为什么 QDoubleSpinBox 的精度有时高于其小数属性允许的精度?

python - 使用 stdout Popen 捕获 sqoop 日志

php - 将 CSS 拆分为多维数组

python - 序列化 `numpy.dtype` 对象 : human readable

python - 如何在 pd.ExcelWriter 中使用 xlsxwritter 引擎在底部的 python 中编写新行?

arrays - ElasticSearch - append 到整数数组

javascript - localStorage仅保存数组的第一个成员

python - 查找 Pandas 列子集中的最大值和第二个最大值之间的差异

python - 使用时间相关数据 Python 进行快速傅立叶变换 (fft)