为何Python NumPy的sum()与手动+求和结果不一致?
问题根源:错误的索引方式导致向量化计算与逐行计算不一致
你遇到的问题核心是向量化索引时的错误取值,并非NumPy的sum()方法有特殊处理。我们来一步步拆解你的代码,找到问题所在:
1. 错误的索引逻辑
先看你向量化计算里的这部分:
NW[nad[:,2].astype(int)][0][0]
我们拆分执行过程:
nad[:,2].astype(int)得到的是数组array([0, 1]),所以NW[nad[:,2].astype(int)]会取出NW的第0行和第1行,结果是:array([[0.29, 0. ], [0.23, 0. ]])- 然后你用
[0][0]取值,这会直接取这个二维数组的**(0,0)位置元素**,也就是0.29——这意味着你的向量化计算中,两行都用了0.29这个值,而不是每行对应取NW中对应行的第0列元素!
而你手动逐行计算时:
- 第一行用的是
NW[nad[0,2].astype(int)][0],也就是NW[0][0] = 0.29 - 第二行用的是
NW[nad[1,2].astype(int)][0],也就是NW[1][0] = 0.23
这就是两种计算结果不一致的根本原因!
2. 修正后的正确写法
要实现“按每行的nad[:,2]索引,取NW对应行的第0列元素”,应该用二维数组的索引语法,直接指定列:
NW[nad[:,2].astype(int), 0]
这样会得到数组array([0.29, 0.23]),正好对应每行需要的取值。
3. 验证修正后的结果
把修正后的代码代入计算:
(nad[:,4] * (nad[:,3] + 0.96 * NW[nad[:,2].astype(int), 0])).sum()
执行结果是0.533276,和你手动逐行求和的结果完全一致!
总结
NumPy的向量化索引需要注意多维数组的取值逻辑,避免用[x][y]这种链式索引(尤其是当x是数组索引时,链式索引会改变维度含义),改用[x, y]的二维索引语法才能得到每行对应的正确取值。
内容的提问来源于stack exchange,提问作者Rnj
相关产品推荐
相关产品推荐

