为什么我不能压制numpy警告

Han*_*nah 36 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])
Run Code Online (Sandbox Code Playgroud)

它给了我一个运行时警告,即使我设置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)

谢谢 :)

mir*_*ulo 61

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

warnings.filterwarnings('ignore')
Run Code Online (Sandbox Code Playgroud)

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

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', r'All-NaN (slice|axis) encountered')
Run Code Online (Sandbox Code Playgroud)

  • 感谢您展示如何。我了解您提出反对的理由。OTOH最近Python软件包作者的警告已失控。如果使用numpy,tensorflow等,通常会有数千行警告。这是一个糟糕的情况。如果警告变得过于繁琐,人们就可以忽略它们或压制它们-尤其是因为他们在开发过程中非常困难地查找实际的错误消息。 (3认同)
  • 举个例子:我在这里是因为我正在取对数,有时输入之一是 0。 NaN 结果就是我接下来所需要的,所以我不想收到垃圾邮件。 (3认同)

Rob*_*ern 11

控制的警告seterr()是由numpy ufunc机械发出的警告; 例如,当在C代码中A / B创建一个NaN实现除法的代码时,比如因为inf/inf这些数组中存在某个地方.其他numpy代码可能会出于其他原因发出自己的警告.在这种情况下,您正在使用其中一个 - NaN标注缩减功能,nanmin()例如.您传递的是一个包含所有NaNs 的数组,或者至少NaN沿着您请求减少的轴的所有s.由于人们使用的通常原因nanmin()是不会再NaN出局,因此nanmin()会发出警告说它别无选择,只能给你一个NaN.这直接进入标准库warnings机械,而不是numpy的ufunc误差控制机制,因为它不是一个ufunc和这种生产的NaN是不一样的东西seterr(invalid=...)用其他方式交易.

  • `numpy.warnings` 只是 stdlib `warnings` 模块的一个偶然别名。`numpy/__init__.py` 导入它以使用它,但忽略从其命名空间中删除它。不要使用`numpy.warnings`;只是“导入警告”。 (2认同)

idn*_*vid 7

您可能希望避免抑制警告,因为 numpy 引发此警告是有充分理由的。如果您想清理输出,可以通过在数组全部为 nan 时显式返回预定义值来处理它。

def clean_nanmedian(s):
    if np.all(np.isnan(s)):
        return np.nan
    return np.nanmedian(s)
Run Code Online (Sandbox Code Playgroud)

另外,请记住,只有在运行时第一次发生这种情况时才会引发此 RuntimeWarning。