numpy 均值、nanmean和警告:空切片平均值

jogvjijk  于 2023-03-18  发布在  其他
关注(0)|答案(3)|浏览(228)

假设我构造了三个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对于bc都返回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的行为呢?我不喜欢警告,也不喜欢手动取消警告。

0sgqnhkj

0sgqnhkj1#

我实在找不出任何理由不压制这一警告。
最安全的方法是使用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而必须采取的任何额外步骤都将导致一些额外的开销,您可以通过取消警告来避免这些开销,而且您的意图将更清楚地反映在代码中。

rks48beu

rks48beu2#

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
vtwuwzda

vtwuwzda3#

当我在一个3-D数组上执行np.nanmean时,我得到了这个运行时警告,例如(time,lon,lat)。也许不是直接回答你的问题,但是我想在我的例子中添加这个警告消息,它可以与所有NaN值系列的点单元格值相关。

相关问题