gpt4 book ai didi

python - numpy 除法与 RuntimeWarning : invalid value encountered in double_scalars

转载 作者:IT老高 更新时间:2023-10-28 20:21:07 28 4
gpt4 key购买 nike

我写了以下脚本:

import numpy

d = numpy.array([[1089, 1093]])
e = numpy.array([[1000, 4443]])
answer = numpy.exp(-3 * d)
answer1 = numpy.exp(-3 * e)
res = answer.sum()/answer1.sum()
print res

但是我得到了这个结果并且发生了错误:

nan
C:\Users\Desktop\test.py:16: RuntimeWarning: invalid value encountered in double_scalars
res = answer.sum()/answer1.sum()

似乎是输入元素太小导致python将它们归零,但除法确实有结果。

如何解决这类问题?

最佳答案

你解决不了。只需 answer1.sum()==0,您无法执行除以零。

发生这种情况是因为 answer1 是 2 个非常大的负数的指数,因此结果四舍五入为零。

nan 在这种情况下返回,因为被零除。

现在要解决您的问题,您可以:

  • 寻找高精度数学库,例如 mpmath 。但这没那么有趣。
  • 作为更大武器的替代品,进行一些数学运算,如下所述。
  • 使用量身定制的 scipy/numpy 函数,它可以完全满足您的需求!查看@Warren Weckesser 的答案。

在这里,我将解释如何进行一些有助于解决此问题的数学运算。我们有分子:

exp(-x)+exp(-y) = exp(log(exp(-x)+exp(-y)))
= exp(log(exp(-x)*[1+exp(-y+x)]))
= exp(log(exp(-x) + log(1+exp(-y+x)))
= exp(-x + log(1+exp(-y+x)))

x=3* 1089y=3* 1093 之上。现在,这个指数的参数是

-x + log(1+exp(-y+x)) = -x + 6.1441934777474324e-06

对于分母,您可以类似地进行,但要获得 log(1+exp(-z+k)) 已经四舍五入为 0,因此参数分母处的指数函数简单地四舍五入为 -z=-3000。然后你有你的结果是

exp(-x + log(1+exp(-y+x)))/exp(-z) = exp(-x+z+log(1+exp(-y+x)) 
= exp(-266.99999385580668)

这已经非常接近如果您只保留两个前导项(即分子中的第一个数字 1089 和第一个数字 1000 在分母):

exp(3*(1089-1000))=exp(-267)

为了它,让我们看看我们与 Wolfram alpha (link) 的解有多接近:

Log[(exp[-3*1089]+exp[-3*1093])/([exp[-3*1000]+exp[-3*4443])] -> -266.999993855806522267194565420933791813296828742310997510523

这个数字和上面的指数的差是+1.7053025658242404e-13,所以我们在分母上做的近似是好的。

最终结果是

'exp(-266.99999385580668) = 1.1050349147204485e-116

从 wolfram alpha 是 (link)

1.105034914720621496.. × 10^-116 # Wolfram alpha.

再一次,在这里使用 numpy 也是安全的。

关于python - numpy 除法与 RuntimeWarning : invalid value encountered in double_scalars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27784528/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com