Python OverflowerError:在不同的运行中以不同的方式引发数学范围错误

Python OverflowerError:在不同的运行中以不同的方式引发数学范围错误,python,numpy,scipy,overflow,exponent,Python,Numpy,Scipy,Overflow,Exponent,我的程序几乎是随意崩溃的 我的代码包括以下两行: z[i, j] = -math.exp(oneminusbeta[j, i]) weights[i,j] = math.exp(beta[j,i] + oneminusbeta[j,i]) 我以前在二维数据上运行过我的全部代码,它是7341x648。我在运行代码时一点问题都没有 但现在我使用的数据大约是10倍大。它是71678 x 648,我得到了这个错误: OverflowError: math range error 我没有任何具体的观点

我的程序几乎是随意崩溃的

我的代码包括以下两行:

z[i, j] = -math.exp(oneminusbeta[j, i])
weights[i,j] = math.exp(beta[j,i] + oneminusbeta[j,i])
我以前在二维数据上运行过我的全部代码,它是
7341x648
。我在运行代码时一点问题都没有

但现在我使用的数据大约是10倍大。它是
71678 x 648
,我得到了这个错误:

OverflowError: math range error
我没有任何具体的观点。我在每一行代码之前都记录注释,这样我就可以看到导致崩溃的原因,而崩溃似乎更频繁地发生在上面提到的第二行(
weights[I,j]=math.exp(beta[j,I]+oneminusbeta[j,I])

问题是,它在不同的时间崩溃。 起初,它在重量[30816,42]时崩溃。然后在
权重[55399,43]
下。然后在
z[33715,45]
处。但所有3种情况下的数据都是相同的

有什么问题吗?这是python的内存相关问题吗?顺便说一下,我也在用
Numba

编辑
我忘了提到,我已经设置了阈值,这样进入
exp()
函数的值就不会超过709或-708,所以从技术上讲不应该出现溢出。

计算结果无法在计算机上显示。这可能意味着
math.exp(…)
大于约10308,或者传递给
math.exp()
的参数大于约710

在每次计算之前,尝试打印
beta[j,i]
oneminusbeta[j,i]
的值

事实上,您不必在每行代码之前都打印注释。相反,尝试使用
try
块包装计算,如下所示:

try:
  weights[i,j] = math.exp(beta[j,i] + oneminusbeta[j,i])
except OverflowError:
  print "Calculation failed! j=%d i=%d beta=%f oneminusbeta=%f"%(j,i,beta[j,i],oneminusbeta[j,i])
  raise

计算结果无法在计算机上显示。这可能意味着
math.exp(…)
大于约10308,或者传递给
math.exp()
的参数大于约710

在每次计算之前,尝试打印
beta[j,i]
oneminusbeta[j,i]
的值

事实上,您不必在每行代码之前都打印注释。相反,尝试使用
try
块包装计算,如下所示:

try:
  weights[i,j] = math.exp(beta[j,i] + oneminusbeta[j,i])
except OverflowError:
  print "Calculation failed! j=%d i=%d beta=%f oneminusbeta=%f"%(j,i,beta[j,i],oneminusbeta[j,i])
  raise

计算结果无法在计算机上显示。这可能意味着
math.exp(…)
大于约10308,或者传递给
math.exp()
的参数大于约710

在每次计算之前,尝试打印
beta[j,i]
oneminusbeta[j,i]
的值

事实上,您不必在每行代码之前都打印注释。相反,尝试使用
try
块包装计算,如下所示:

try:
  weights[i,j] = math.exp(beta[j,i] + oneminusbeta[j,i])
except OverflowError:
  print "Calculation failed! j=%d i=%d beta=%f oneminusbeta=%f"%(j,i,beta[j,i],oneminusbeta[j,i])
  raise

计算结果无法在计算机上显示。这可能意味着
math.exp(…)
大于约10308,或者传递给
math.exp()
的参数大于约710

在每次计算之前,尝试打印
beta[j,i]
oneminusbeta[j,i]
的值

事实上,您不必在每行代码之前都打印注释。相反,尝试使用
try
块包装计算,如下所示:

try:
  weights[i,j] = math.exp(beta[j,i] + oneminusbeta[j,i])
except OverflowError:
  print "Calculation failed! j=%d i=%d beta=%f oneminusbeta=%f"%(j,i,beta[j,i],oneminusbeta[j,i])
  raise

你的溢出几乎可以肯定是一个真正的溢出;其中一个值太大,无法放入Python
float
(表示C
double


那么,为什么每次都发生在不同的地方呢

因为你在用麻木

Numba JIT编译您的代码。如果它检测到没有争用,它可以对代码重新排序,甚至,至少在理论上,在多核或GPU上并行运行它(尽管我认为目前只有使用numba.cuda显式编码时,才能得到GPU计算)

无论如何,这意味着通过代码的路径可能是不确定的。如果有多个地方可能发生溢出,您无法预测哪个地方会失败并触发异常



无论如何,这并不重要。如果您的计算溢出,您必须修复该问题。每次都有不同的溢出,这一事实不应使调试变得那么困难,特别是考虑到它显然通常发生在一个地方,只是不总是如此。

您的溢出几乎肯定是一个真正的溢出;其中一个值太大,无法放入Python
float
(表示C
double


那么,为什么每次都发生在不同的地方呢

因为你在用麻木

Numba JIT编译您的代码。如果它检测到没有争用,它可以对代码重新排序,甚至,至少在理论上,在多核或GPU上并行运行它(尽管我认为目前只有使用numba.cuda显式编码时,才能得到GPU计算)

无论如何,这意味着通过代码的路径可能是不确定的。如果有多个地方可能发生溢出,您无法预测哪个地方会失败并触发异常



无论如何,这并不重要。如果您的计算溢出,您必须修复该问题。每次都有不同的溢出,这一事实不应使调试变得那么困难,特别是考虑到它显然通常发生在一个地方,只是不总是如此。

您的溢出几乎肯定是一个真正的溢出;其中一个值太大,无法放入Python
float
(表示C
double


那么,为什么每次都发生在不同的地方呢

因为你在用麻木

Numba JIT编译您的代码。如果它检测到没有争用,它可以对代码重新排序,甚至,至少在理论上,在多核或GPU上并行运行它(尽管我认为目前只有使用numba.cuda显式编码时,才能得到GPU计算)

无论如何