Mic*_*rie 55 python warnings numpy
假设我构造了两个numpy数组:
a = np.array([np.NaN, np.NaN])
b = np.array([np.NaN, np.NaN, 3])
Run Code Online (Sandbox Code Playgroud)
现在我发现两者的np.mean回报和:nanab
>>> np.mean(a)
nan
>>> np.mean(b)
nan
Run Code Online (Sandbox Code Playgroud)
自numpy 1.8(2016年4月20日发布)以来,我们一直很幸运nan,忽略了nan价值观:
>>> np.nanmean(b)
3.0
Run Code Online (Sandbox Code Playgroud)
然而,当阵列无关,但 nanmean价值,它提出了一个警告:
>>> np.nanmean(a)
nan
C:\python-3.4.3\lib\site-packages\numpy\lib\nanfunctions.py:598: RuntimeWarning: Mean of empty slice
warnings.warn("Mean of empty slice", RuntimeWarning)
Run Code Online (Sandbox Code Playgroud)
我不喜欢压制警告; 是否有更好的功能,我可以用来获得np.mean没有警告的行为?
ali*_*i_m 53
我真的看不出有任何理由不去压制警告.
最安全的方法是使用warnings.catch_warnings上下文管理器仅在您预期发生警告时抑制警告 - 这样您就不会错过RuntimeWarnings在代码的其他部分可能意外引发的任何其他内容:
import numpy as np
import warnings
x = np.ones((1000, 1000)) * np.nan
# I expect to see RuntimeWarnings in this block
with warnings.catch_warnings():
warnings.simplefilter("ignore", category=RuntimeWarning)
foo = np.nanmean(x, axis=1)
Run Code Online (Sandbox Code Playgroud)
@ dawg的解决方案也可以工作,但是为了避免np.nanmean在所有NaN阵列上进行计算,你必须采取的任何额外步骤都会产生一些额外的开销,你可以通过抑制警告来避免这些开销.此外,您的意图将更清晰地反映在代码中.
daw*_*awg 12
甲NaN值被定义为不等于本身:
>>> float('nan') == float('nan')
False
>>> np.NaN == np.NaN
False
Run Code Online (Sandbox Code Playgroud)
您可以使用Python条件,并且nan的属性永远不等于它自己以获得此行为:
>>> a = np.array([np.NaN, np.NaN])
>>> b = np.array([np.NaN, np.NaN, 3])
>>> np.NaN if np.all(a!=a) else np.nanmean(a)
nan
>>> np.NaN if np.all(b!=b) else np.nanmean(b)
3.0
Run Code Online (Sandbox Code Playgroud)
你也可以这样做:
import warnings
import numpy as np
a = np.array([np.NaN, np.NaN])
b = np.array([np.NaN, np.NaN, 3])
with warnings.catch_warnings():
warnings.filterwarnings('error')
try:
x=np.nanmean(a)
except RuntimeWarning:
x=np.NaN
print x
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53279 次 |
| 最近记录: |