在NumPy中忽略除以0警告

ove*_*mer 29 python numpy divide-by-zero suppress-warnings

我有统计问题的功能:

import numpy as np
from scipy.special import gamma as Gamma

def Foo(xdata):
    ...
    return x1 * (
                 ( #R is a numpy vector
                  ( ((R - x2)/beta) ** (x3 -1) ) * 
                  ( np.exp( - ((R - x2) / x4) ) ) /
                  ( x4 * Gamma(x3))
                 ).real
                )
Run Code Online (Sandbox Code Playgroud)

有时我会从shell获得以下警告:

RuntimeWarning: divide by zero encountered in...
Run Code Online (Sandbox Code Playgroud)

我使用numpy isinf函数来纠正其他文件中函数的结果,所以我不需要这个警告.

有没有办法忽略这条消息?换句话说,我不希望shell打印此消息.

我不想禁用所有python警告,只是这个.

ddd*_*snn 71

您可以使用禁用警告numpy.seterr.将此除以零之前的可能除法:

np.seterr(divide='ignore')
Run Code Online (Sandbox Code Playgroud)

这将全局禁用零分区警告.如果您只是想稍微禁用它们,可以numpy.errstatewith子句中使用:

with np.errstate(divide='ignore'):
    # some code here
Run Code Online (Sandbox Code Playgroud)

对于零除零(未确定,导致NaN),错误行为随numpy版本1.12.0而改变:现在认为这是"无效",而之前它是"除".

因此,如果您的分子有可能也为零,请使用

np.seterr(divide='ignore', invalid='ignore')
Run Code Online (Sandbox Code Playgroud)

要么

with np.errstate(divide='ignore', invalid='ignore'):
    # some code here
Run Code Online (Sandbox Code Playgroud)

请参阅发行说明中的"兼容性"部分, "新功能"部分之前的最后一段:

比较NaN浮点数现在会引发无效的运行时警告.如果预期NaN,则可以使用np.errstate忽略警告.

  • 我喜欢最后一个解决方案 (2认同)