You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于NumPy einsum运算结果不符合预期的问题咨询

关于NumPy einsum运算结果不符合预期的问题咨询

嗨,我来帮你理清楚这个问题~你得到的结果和预期不符,核心是没搞明白NumPy einsum的下标规则,尤其是**重复下标和自动缩约(求和)**的逻辑。

先拆解你的代码和表达式:

  • 数组a是形状(3,2)的二维数组,对应你写的下标xy,也就是x代表3行,y代表2列;
  • 数组b是形状(2,3)的二维数组,对应下标zx,也就是z代表2行,x代表3列;
  • 你的einsum表达式是"xy,zx -> yx",这里的关键问题是:下标z只在输入里出现,没有出现在输出的yx中,按照einsum的规则,这种未出现在输出里的下标会被自动求和(缩约)。

具体来说,输出中[y][x]位置的元素,einsum实际在计算:

sum_z(a[x][y] * b[z][x])

因为b里所有元素都是2,z有2个取值(0和1),所以求和的结果就是2+2=4。代入计算的话:

  • 输出[0][0] = 1*(2+2) = 4
  • 输出[0][1] = 3*(2+2) = 12
  • 以此类推,就得到了你看到的[[4 12 20] [8 16 24]]。

再看你的预期:你想要的是a[x][y]和b对应位置的2直接相乘,最终得到[[1*2,3*2,5*2],[2*2,4*2,6*2]]。这时候需要调整einsum的下标,避免自动求和——我们需要让a的y维度(长度2)和b的z维度(长度2)一一对应,而不是对z求和。

把b的下标z改成y,表达式就变成了:

print(np.einsum("xy,yx -> yx", a, b))

这时候,所有输入的下标x、y都出现在输出里,einsum就会执行逐元素对应相乘,而不是求和。因为b的每个元素都是2,结果正好就是你预期的[[2 6 10] [4 8 12]]。

顺便补充两个einsum的核心规则,方便你以后用的时候避坑:

  • 如果一个下标在多个输入数组里出现,这些数组的对应维度长度必须一致,einsum会把这些维度的元素一一对应;
  • 如果一个下标只在输入里出现、没在输出里出现,einsum会自动对这个维度的所有元素求和;
  • 输出的下标顺序直接决定了结果数组的维度顺序。

备注:内容来源于stack exchange,提问作者13byte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:05:30