使用numpy整数调用泊松函数时结果异常的原因咨询
问题原因分析
你的问题核心在于Python原生整数与numpy整数的运算规则差异,具体拆解如下:
- 数值类型的运算优先级:当Python原生数值(比如作为
_lambda_的int/float)与numpy整数(np.int64(70))进行运算时,numpy会将整个运算转换为numpy类型的计算。例如_lambda_ ** x,如果_lambda_是Python整数,x是np.int64,结果会是np.int64类型。 - numpy整数的溢出问题:
np.int64的取值范围是[-9223372036854775808, 9223372036854775807],而_lambda_ ** 70(比如当_lambda_取60这类数值时,60^70的数值远超出该范围),会触发整数溢出回绕,得到一个负数。 - 错误的传播:这个负数乘以
math.exp(-_lambda_)(正数)后仍为负数,再除以math.factorial(x)(正数),最终得到错误的负数结果。而Python原生整数是任意精度的,不会发生溢出,所以运算全程数值正确。
解决方法
你可以通过两种方式修复该问题:
将numpy整数转换为Python原生整数:在函数内部或调用时,用
int(x)转换numpy整数:# 调用时转换 poisson(int(np.int64(70)), mylambda) # 或修改函数内部 def poisson(x, _lambda_): x = int(x) return (math.exp(-_lambda_) * _lambda_ ** x) / math.factorial(x)使用numpy的数学函数替代math模块:numpy的函数支持numpy类型,且会自动处理为浮点运算避免整数溢出:
import numpy as np def poisson_np(x, _lambda_): return (np.exp(-_lambda_) * np.power(_lambda_, x)) / np.math.factorial(x)
内容的提问来源于stack exchange,提问作者RaNdOmE NaMe
相关产品推荐
相关产品推荐

