意思是,nanmean和警告:空切片的意思

时间:2015-04-17 00:22:07

标签: python numpy warnings

假设我构造了两个numpy数组:

a = np.array([np.NaN, np.NaN])
b = np.array([np.NaN, np.NaN, 3])

现在我发现np.meannana 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}}没有那个警告的行为?

2 个答案:

答案 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)
@ dawg的解决方案也可以使用,但最终为了避免在所有NaN数组上计算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