爱因斯坦求和约定einsum简单例题解读

概论

在爱因斯坦求和约定或 einsum() 格式字符串中,所有的索引都可以分为两类:自由索引集和求和索引集。它们的区别很简单:

  • 自由索引是用于输出规范中的索引。它们与外层 for 循环相关联。
  • 求和索引是所有其他索引:它们出现在参数规范中,但不出现在输出规范中。之所以称为求和索引,是因为在计算输出张量时,这些索引的维度被求和掉了。它们与内层 for 循环相关联。

根据这种划分,每类索引的角色就很明确了:自由索引用于遍历每个输出元素,而求和索引用于计算和求和所需的乘积项。

具体例子

import numpy as np
# 定义一个 2 × 2 矩阵
a = np.array([[2, 3],[4, 5]])

# ii 代表对角线向量(2, 5)
# ii,ij 代表 (2, 5) * ((2,3),(4,5))
# ij 是求和轴,ij都保留
np.einsum('ii,ij->ij', a, a)
输出:array([[ 4,  6],
       [20, 25]])

# 求和轴只有i,说明是沿着j轴求和
# 4+6=10,20+25=45,即(10,45)
np.einsum('ii,ij->i', a, a)
输出:array([10, 45])

#求和轴只有j,说明沿着i轴求和
#4+20, 6+25
np.einsum('ii,ij->j', a, a)
输出:array([24, 31])

#箭头右侧ij表示全部保留,只能原位计算了
np.einsum('ij,ij->ij', a, a)
输出:array([[ 4,  9],
       [16, 25]])
posted @ 2024-08-12 11:05  立体风  阅读(44)  评论(0编辑  收藏  举报