为何使用numpy.dot计算正输入点积会得到负数结果?
问题原因及解决办法
核心原因:整数溢出
numpy数组默认使用的整数类型(比如int32,取决于操作系统和numpy版本)存在取值上限,而你计算的点积结果远超出了这个上限,导致整数溢出,最终得到负数结果;而Python原生的int是任意精度类型,不会有溢出问题,所以for循环计算能得到正确值。
具体来说:
- 你计算的点积实际值是
sum(i*(i+1000000) for i in range(1000000)),代入求和公式计算后,结果约为3.333331666665×10^17。 - 而
int32类型的最大值仅为2147483647(约2×10^9),这个结果是它的100多万倍,溢出后按照补码规则会被解析为负数。
解决办法
在创建numpy数组时,指定更高精度的整数类型(比如int64),就能避免溢出问题:
import numpy as np arr1 = list(range(1000000)) arr2 = list(range(1000000, 2000000)) # 显式指定dtype为int64 np_arr1 = np.array(arr1, dtype=np.int64) np_arr2 = np.array(arr2, dtype=np.int64) # 此时计算点积会得到正确结果 dot_result = np.dot(np_arr1, np_arr2) print(dot_result)
你也可以使用float64类型来存储数组,同样能避免溢出,不过会引入微小的浮点误差(对于这个场景来说几乎可以忽略)。
内容的提问来源于stack exchange,提问作者Ajeet Singh Yadav
相关产品推荐
相关产品推荐

