我真的想避免这些恼人的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)
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 引发此警告是有充分理由的。如果您想清理输出,可以通过在数组全部为 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。
| 归档时间: |
|
| 查看次数: |
26057 次 |
| 最近记录: |