当前位置: 首页 > 面试题库 >

带有RuntimeWarning的numpy除法:在double_scalars中遇到无效的值

宋智明
2023-03-14
问题内容

我写了以下脚本:

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,您不能执行零除。

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

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* 1089和哪里y=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)

如果仅保留2个前导项(即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。



 类似资料:
  • 问题内容: 当我运行代码时,偶尔会以四个为一组的形式收到这些警告。我试图通过在某些语句之前和之后放置调试消息来定位源,以查明源。 这是Numpy警告,什么是双标量? 从Numpy我使用 我也使用Matplotlib 问题答案: 看起来像是浮点计算错误。检查numpy.seterr函数以获取有关发生位置的更多信息。

  • 问题内容: 我正在使用numpy.log10来计算概率值数组的对数。数组中有一些零,我正在尝试使用 但是,仍然出现,并且我确定这是引起警告的行。 尽管我的问题已解决,但我还是困惑为什么此警告一次又一次出现? 问题答案: 计算所有元素的以10为底的对数,甚至是元素未选择的对数。如果需要,可以在取对数以消除问题之前用或零填充一些零值。(不过,请确保您不`prob 0.0000000001`使用虚拟值进

  • 有没有一个有效的方法来删除Nones从Numpy数组和调整数组到它的新大小? 例如,如何在不在python中迭代的情况下从这个框架中删除None。我可以很容易地对它进行迭代,但正在处理一个可能被多次调用的api调用。

  • 问题内容: 我是编程新手。在我最新的Python 2.7项目中,我遇到了以下问题: RuntimeWarning:long_scalars中遇到溢出 有人可以详细说明这意味着什么,我可以做些什么来解决? 代码会一直运行,但是我不确定忽略警告是否是个好主意。 它发生在附加过程中,例如: 问题答案: 这是发出相同警告的示例: 产量 在上面的示例中,它的发生是因为的类型是dtype ,并且在an中可存储

  • 问题内容: 我遇到了运行时警告 由我的这一行代码生成: 两个和是numpy的阵列 该警告可能是什么原因? 问题答案: 这很可能是由于所涉及的输入中的某处而发生的。它的一个示例如下所示- 对于所有涉及的比较,它将输出。让我们确认一下以进行比较。这是一个示例- 请注意输出中的第三列,该列与包含第三元素的比较相对应,并得出所有值。

  • 这个程序应该输出 但是如果我输入的大小是4,我只输入这些值,但是如果我写的大小是4。。。它不需要我提供4个参数,而是需要3个参数并打印('',1,2,3) 请帮帮忙