为什么我不能压制numpy警告

时间:2015-03-30 13:51:28

标签: python numpy

我真的想避免这些讨厌的numpy警告,因为我必须处理很多NaNs。我知道这通常是用seterr完成的,但由于某些原因,它不起作用:

import numpy as np
data = np.random.random(100000).reshape(10, 100, 100) * np.nan
np.seterr(all="ignore")
np.nanmedian(data, axis=[1, 2])

它给了我一个运行时警告,即使我设置numpy忽略所有错误......任何帮助?

编辑(这是收到的警告):

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-p‌​ackages/numpy/lib/nanfunctions.py:612: RuntimeWarning: All-NaN slice encountered warnings.warn("All-NaN slice encountered", RuntimeWarning)

谢谢:)

3 个答案:

答案 0 :(得分:57)

警告通常很有用,在大多数情况下我不建议这样做,但您始终可以使用Warnings模块忽略filterwarnings的所有警告:

numpy.warnings.filterwarnings('ignore')

如果您想要唯一地压缩您的特定错误,可以使用以下命令对其进行指定:

with numpy.warnings.catch_warnings():
    numpy.warnings.filterwarnings('ignore', r'All-NaN (slice|axis) encountered')

答案 1 :(得分:11)

seterr()控制的警告是由numpy ufunc机器发出的警告;例如当A / B在实现除法的C代码中创建NaN时,比如因为这些数组中的某处有inf/inf。其他numpy代码可能会出于其他原因发出自己的警告。在这种情况下,您正在使用其中一个NaN - 忽略缩减功能,例如nanmin()等。您传递的数组包含沿您请求减少的轴的所有NaN或至少所有NaN s。由于使用nanmin()的通常原因是不能将NaN另外nanmin()NaN会发出警告,表示除了给您warnings之外别无选择。这直接转到标准库NaN机器,而不是numpy ufunc错误控制机制,因为它不是ufunc,而seterr(invalid=...)的这个产生与{{1}}不同。否则处理。

答案 2 :(得分:0)

您可能要避免抑制警告,因为numpy出于充分的理由提出了此警告。如果您想清理输出,则可以通过在数组全部为nan时显式返回预定义值来处理输出。

def clean_nanmedian(s):
    if np.all(np.isnan(s)):
        return np.nan
    return np.nanmedian(s)

此外,请记住,此RuntimeWarning仅在您的运行时第一次发生时引发。