我真的想避免这些讨厌的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-packages/numpy/lib/nanfunctions.py:612: RuntimeWarning: All-NaN slice encountered warnings.warn("All-NaN slice encountered", RuntimeWarning)
谢谢:)
答案 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仅在您的运行时第一次发生时引发。