为何使用numpy对数组求大于9的幂会返回错误结果?
问题根源:Numpy整数类型的溢出限制
你遇到的问题核心是Numpy默认整数类型的溢出回绕,和Python原生整数的任意精度特性差异导致的。
为什么会得到错误结果?
当你用np.array(arr)创建数组时,Numpy默认会选择**32位有符号整数(np.int32)**作为数组类型。32位有符号整数的最大值是2^31 - 1 = 2147483647,而10^10 = 10000000000远大于这个上限,所以数值溢出后发生了回绕:
- 计算
10000000000 % 2^32(32位整数的模周期是2^32),结果正好是1410065408,这就是Numpy返回的错误值。
而Python原生的int类型是任意精度的,它可以处理无限大的整数(只要内存足够),所以n**number能正确计算出10000000000。
解决方案:指定更大的整数类型
你只需要在创建数组或者调用np.power时,明确指定64位整数类型就能解决问题:
方案1:创建数组时指定dtype
import numpy as np number = 10 arr = [number] # 指定64位整数类型 print(np.power(np.array(arr, dtype=np.int64), number)) # 输出 [10000000000]
方案2:计算时指定dtype
print(np.power(np.array(arr), number, dtype=np.int64)) # 同样输出 [10000000000]
额外提示
如果你的数值会超过64位整数的上限(9223372036854775807),可以考虑使用np.float64(但要注意浮点精度问题,不过10^10在float64中是精确表示的),或者使用object类型数组来存储Python原生整数:
print(np.power(np.array(arr, dtype=object), number)) # 输出 [10000000000]
内容的提问来源于stack exchange,提问作者Artsiom Shamsutdzinau
相关产品推荐
相关产品推荐

