抓住我在计算中得到 NaN 的那一刻

Posted

技术标签:

【中文标题】抓住我在计算中得到 NaN 的那一刻【英文标题】:Catch the moment I get a NaN in my calculations 【发布时间】:2014-10-19 18:13:22 【问题描述】:

我正在使用线性回归运行循环,并在我经常以无穷大结束的地方进行计算。当我检查变量输出时,我注意到当我开始得到“NaNs”时事情会崩溃。我尝试了很多不同的方法来处理无穷大,但我的程序最终还是崩溃了。我已经完成了诸如用非常大或非常小的值替换 NaN 之类的事情,但现在我认为这一切都没用。我不应该一视同仁地对待所有的 NaN - 显然,有些 NaN 是在玩正无穷大时出现的,有些是负无穷大。

我真的需要知道我的代码究竟是在哪一点突然产生 NaN,以及产生它的是负无穷大还是正无穷大。在程序崩溃之前我该怎么做?

编辑

我知道如何检查 NaN。我可以简单地使用numpy.isnan,并且我已经使用它了。但我想知道什么时候它会发生。是不是有异常或者发生时可以调用或抛出警告的东西?

【问题讨论】:

可以分享你的代码。以便找到? “我已经做过诸如用非常大或非常小的值替换 NaN 之类的事情,但现在我认为这一切都没用” 这主要是没有意义的。 NaN 是例如 infinity/infinity 。盲目地用“非常低”或“非常大的价值”来代替它是完全错误的。 @SylvainLeroux 是的,没错,这就是我所意识到的,这就是为什么我想知道 NaN 是什么时候以及是什么原因造成的。 不,它不是重复的,我知道如何“检查它”,我所做的就是使用 isnan,但我想检查 何时 它发生了,所以我可以看看为什么。 具体来说,您在做什么?您应该如何处理异常情况通常在很大程度上取决于您要解决的具体问题。 【参考方案1】:

如果您想捕获使用 numpy 的数字异常,您最好的选择可能是使用 numpy.seterr

例如,在无效操作上引发异常(导致 NaN):

import numpy as np

np.seterr(invalid='raise')
np.float64(0)/0.

在控制台上显示:

Traceback (most recent call last):
  File "h.py", line 4, in <module>
    np.float64(0)/0.
FloatingPointError: invalid value encountered in double_scalars

【讨论】:

我明白了。所以你是说我在我怀疑可能导致 NaN 的那一行之上添加了 np.seterr 行? 仅供参考:对应的上下文管理器是np.errstate (docs.scipy.org/doc/numpy/reference/generated/…)。 @WarrenWeckesser 我更想在全球范围内更改“异常”处理,因为 OP 不知道问题的确切位置。但对于更窄的范围,np.errstate 显然是要走的路。

以上是关于抓住我在计算中得到 NaN 的那一刻的主要内容,如果未能解决你的问题,请参考以下文章

推荐近乎免费的调试神器——OzCode

如何捕获第一次显示WizardPage

C++ 问题我每次运行程序时都会得到“nan”作为输出

求助:卡西欧fx5800怎样编坐标正算中桩边桩计算公式、坐标反算计算公式、圆曲线中桩边桩计算公式?

为啥我在本地文件中得到 NaN 但我的小提琴很好

令母亲心碎的那一刻