假设我构造了三个numpy数组:
a = np.array([1, 2, 3])
b = np.array([np.NaN, np.NaN, 3])
c = np.array([np.NaN, np.NaN, np.NaN])
现在我发现np.mean
对于b
和c
都返回nan
:
>>> np.mean(a)
2.0
>>> np.mean(b)
nan
>>> np.mean(c)
nan
自从numpy 1.8(2016年4月20日发布)以来,我们一直有幸使用nanmean,它忽略了nan
的值:
>>> np.nanmean(a)
2.0
>>> np.nanmean(b)
3.0
>>> np.nanmean(c)
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
非常好,但是它有一个奇怪的、不受欢迎的行为,即当数组除了nan
值之外什么都没有时会引发警告。
如果没有警告,我怎么能得到nanmean
的行为呢?我不喜欢警告,也不喜欢手动取消警告。
3条答案
按热度按时间0sgqnhkj1#
我实在找不出任何理由不压制这一警告。
最安全的方法是使用
warnings.catch_warnings
上下文管理器,仅在您预期警告发生的地方抑制警告-这样您就不会错过任何可能在代码的其他部分意外引发的额外RuntimeWarnings
:@dawg的解决方案也可以工作,但最终,为了避免在所有NaN的数组上计算
np.nanmean
而必须采取的任何额外步骤都将导致一些额外的开销,您可以通过取消警告来避免这些开销,而且您的意图将更清楚地反映在代码中。rks48beu2#
NaN
值被定义为不等于其自身:你可以使用Python的条件语句和nan不等于自身的属性来获得这样的行为:
您还可以执行以下操作:
vtwuwzda3#
当我在一个3-D数组上执行np.nanmean时,我得到了这个运行时警告,例如(time,lon,lat)。也许不是直接回答你的问题,但是我想在我的例子中添加这个警告消息,它可以与所有NaN值系列的点单元格值相关。