为何Numpy数组计算点积与手动实现函数结果存在差异?
问题分析:手动点积与Numpy点积结果不一致的原因
问题根源
Python原生的int类型是任意精度整数,无论数值多大都不会出现溢出问题,所以手动循环计算的结果是准确的。
而Numpy默认创建的数组会使用固定精度的整数类型(通常是int32,取决于系统配置),int32能表示的最大值是2^31 - 1 = 2147483647,你的点积结果833332333333500000远远超出这个范围,计算时发生了整数溢出,最终得到错误的负数结果。
解决办法
创建Numpy数组时,显式指定更高精度的整数类型(比如int64),或者使用浮点类型,就能得到正确结果:
指定int64类型
import numpy as np arr1 = list(range(1000000)) arr2 = list(range(1000000, 2000000)) # 显式指定dtype为int64 arr1_np = np.array(arr1, dtype=np.int64) arr2_np = np.array(arr2, dtype=np.int64) print(np.dot(arr1_np, arr2_np)) # 输出:833332333333500000
使用浮点类型
如果不需要严格的整数精度,也可以用float64类型:
arr1_np = np.array(arr1, dtype=np.float64) arr2_np = np.array(arr2, dtype=np.float64) print(np.dot(arr1_np, arr2_np)) # 输出:8.333323333335e+17(与手动计算结果等价)
结果正确性验证
你可以用数学公式验证点积的准确值:
对于arr1 = [0,1,2,...,n-1],arr2 = [n, n+1, ..., 2n-1],点积公式为:
$\sum_{k=0}^{n-1} k*(n+k) = n*\sum k + \sum k^2 = n*(n-1)n/2 + (n-1)n(2n-1)/6$
代入n=1000000,计算结果就是833332333333500000,和手动计算结果一致。
内容的提问来源于stack exchange,提问作者Felix Bernt
相关产品推荐
相关产品推荐

