我有一个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%
如何让python打印出警告的位置?
答案 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中;
linregress
和pearsonr
中的stats.py
。
{li> pearsonr
mstats_basic.py
。
为什么:double_scalar是单个double
而不是numpy数组。我认为在某些调用中r_num
和/或r_den
是一个(无效的)浮点数。但它不是零,因为零不是无效数字,这会引发ZeroDivisionError异常。当计算返回NaN时,通常会发出无效警告。