Python / numpy定位运行时警告

时间:2014-03-26 19:58:08

标签: python numpy

我有一个numpy脚本坐在app服务器上,它被调用了数千次,一次在蓝色的月亮我得到一个运行时警告:

/usr/local/lib/python2.7/dist-packages/scipy/stats/stats.py:2417: RuntimeWarning: invalid value encountered in double_scalars
r = (r_num / r_den)
  1. 不确定这种情况发生在哪里。
  2. 为什么会这样。
  3. 它对代码的影响(如果有的话)。一切都通过了眼睛测试和单元测试。
  4. 但我再也不确定我是否正在寻找合适的地方,因为这次报警发生的可能性不到1%

    如何让python打印出警告的位置?

3 个答案:

答案 0 :(得分:10)

如果你把

np.seterr(all='raise')

在脚本开头附近,exceptions will be raised而不是警告。这将使用一个很好的回溯来暂停你的脚本,它将为你提供有关错误发生位置的信息。

然后,您可以在代码中围绕该行添加try...except以引发异常,并使用except子句记录相关变量的值。


此外,您发布的RuntimeWarning表示警告来自stats.py,第2417行。这似乎在pearsonr函数中。谷歌搜索“double_scalars中遇到的无效值”产生了this SO question,表明

from scipy.stats.stats import pearsonr

X = [4, 4, 4, 4, 4, 4]
Y = [4, 5, 5, 4, 4, 4]

pearsonr(X, Y)

提高RuntimeWarning。这表明您偶尔使用输入调用pearsonr导致除以零(如user3453425 stated) - 可能是由于其中一个输入是常量,因此标准偏差为零。 / p>

在这种情况下,pearsonr(X, Y)会返回(nan, 1.0)。因此,当皮尔逊相关系数未定义(nan)时,请确保处理该情况。

答案 1 :(得分:1)

将警告变为例外:

import warnings
warnings.simplefilter('error')

这样,会出现错误,您将看到回溯。

答案 2 :(得分:1)

其中:查看代码

r = (r_num / r_den)

这只发生在scipy的two places中;

    {li> linregresspearsonr中的stats.py。 {li> pearsonr mstats_basic.py

为什么:double_scalar是单个double而不是numpy数组。我认为在某些调用中r_num和/或r_den是一个(无效的)浮点数。但它不是零,因为零不是无效数字,这会引发ZeroDivisionError异常。当计算返回NaN时,通常会发出无效警告。