np.einsum('ij,kl->il')运算逻辑解析及与矩阵乘法的疑问
问题拆解与运算逻辑分析
1. 求和维度的明确
在np.einsum('ij,kl->il', A, B)中,被求和的是A的第二个维度j和B的第一个维度k。einsum的核心规则是:所有没出现在输出标签(这里是il)里的输入维度,都会被遍历后求和。这里输入维度是i,j(对应A的(4,2)形状)和k,l(对应B的(2,3)形状),输出只保留i和l,所以j和k这两个维度会被完全遍历并累加求和。
2. 直观理解方式
这个操作可以简化成:输出矩阵E的每个元素E[i,l],等于A第i行所有元素的和,乘以B第l列所有元素的和。
推导过程很直接:对于固定的i和l,E[i,l]的计算是对所有j(0到1)和k(0到1)的A[i,j] * B[k,l]求和,拆分后就是:
E[i,l] = (A[i,0] + A[i,1]) × (B[0,l] + B[1,l])
把双重求和转化成两个单求和的乘积,一下子就清晰了。
3. 示例数值拆解验证
用给定的矩阵A和B实际算几个值,验证逻辑:
- A:
np.array([[1,2],[3,4],[5,6],[7,8]])(4行2列) - B:
np.array([[9,10,11],[12,13,14]])(2行3列)
计算E[0,0]
- A第0行的和:1+2=3
- B第0列的和:9+12=21
- E[0,0] = 3×21=63
- 对应einsum的展开计算:1×9 +1×12 +2×9 +2×12 =9+12+18+24=63,结果完全一致。
计算E[1,1]
- A第1行的和:3+4=7
- B第1列的和:10+13=23
- E[1,1] =7×23=161
- 展开计算:3×10 +3×13 +4×10 +4×13=30+39+40+52=161,没问题。
计算E[3,2]
- A第3行的和:7+8=15
- B第2列的和:11+14=25
- E[3,2]=15×25=375
- 展开计算:7×11 +7×14 +8×11 +8×14=77+98+88+112=375,完全匹配。
4. 和常规矩阵乘法的区别
常规矩阵乘法np.einsum('ij,jk->ik', A, B)是对共享的维度j=k求和(A的第j列和B的第j行对应相乘后累加),而当前操作是对两个独立的维度j和k分别求和后再相乘,只是刚好输出维度和矩阵乘法一样(都是4行3列),本质逻辑完全不同。
内容的提问来源于stack exchange,提问作者nbulkz
相关产品推荐
相关产品推荐

