在 NumPy 中忽略除以 0 警告

Posted

技术标签:

【中文标题】在 NumPy 中忽略除以 0 警告【英文标题】:Ignore divide by 0 warning in NumPy 【发布时间】:2015-07-09 03:24:09 【问题描述】:

我有一个统计问题的函数:

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
                )

有时我会从 shell 收到以下警告:

RuntimeWarning: divide by zero encountered in...

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

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

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

【问题讨论】:

如果你不需要从中恢复,你可以抓住它并忽略它。 你总是可以使用try... except ZeroDivisionError(或者任何抛出的错误) How to disable python warnings 的可能重复项 @letsc 没有抛出错误。 OP 收到警告。 marsh 我不想禁用所有警告。如果可能的话,就这样吧。 【参考方案1】:

您可以使用numpy.seterr 禁用警告。把它放在可能被零除之前:

np.seterr(divide='ignore')

这将在全局范围内禁用零除法警告。如果您只是想暂时禁用它们,可以在 with 子句中使用 numpy.errstate

with np.errstate(divide='ignore'):
    # some code here

对于零除零(未确定,导致 NaN),错误行为在 numpy 版本 1.12.0 中发生了变化:现在被认为是“无效”,而之前是“除法”。

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

np.seterr(divide='ignore', invalid='ignore')

with np.errstate(divide='ignore', invalid='ignore'):
    # some code here

请参阅release notes 中的“兼容性”部分,“新功能”部分之前的最后一段:

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

【讨论】:

我喜欢最后的解决方案【参考方案2】:

您也可以使用numpy.divide 进行除法。这样您就不必明确禁用警告。

In [725]: np.divide(2, 0)
Out[725]: 0

【讨论】:

这其实不是真的。至少,对于 NumPy 版本 1.15.4 不再正确。现在返回 inf

以上是关于在 NumPy 中忽略除以 0 警告的主要内容,如果未能解决你的问题,请参考以下文章

升级到 scikit 0.15 时导入错误,numpy 警告

使用 LLVM/Clang 忽略特定文件中的所有警告

在Powershell中忽略来自FFMPEG控制台输出的特定警告

怎么忽略KEIL的警告

iOS常用的忽略警告

忽略 Xcode 8 中的注释警告 - 记得要让着本宝宝