假设我构造了两个numpy数组:
a = np.array([np.NaN, np.NaN])
b = np.array([np.NaN, np.NaN, 3])
现在我发现np.mean
为nan
和a
b
返回>>> np.mean(a)
nan
>>> np.mean(b)
nan
:
nan
自numpy 1.8(2016年4月20日发布)以来,我们已被nanmean祝福,忽略了>>> np.nanmean(b)
3.0
值:
nan
但是,当数组中没有但 >>> 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)
值时,它会发出警告:
nanmean
我不喜欢压制警告;是否有一个更好的功能,我可以使用{{1}}没有那个警告的行为?
答案 0 :(得分:45)
我真的看不出有任何理由不公开警告。
最安全的方法是使用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)
np.nanmean
而必须采取的任何其他步骤都会产生一些额外的开销,你可以避免只是压制警告。此外,您的意图将更清晰地反映在代码中。
答案 1 :(得分:9)
NaN
值被定义为不等于它自己:
>>> float('nan') == float('nan')
False
>>> np.NaN == np.NaN
False
你可以使用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
你也可以这样做:
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