【问题标题】:Mean ignoring NaNs along columns in a NumPy array without using numpy.nanmean意味着在不使用 numpy.nanmean 的情况下忽略 NumPy 数组中的列的 NaN
【发布时间】:2017-06-27 21:51:16
【问题描述】:

我有一个如下的 numpy 数组:

x = array([[  1.,   2.,   3.],
           [  4.,   5.,   6.],
           [ nan,   8.,   9.]])

我想计算每列的平均值。如果我使用np.mean(x, axis=0),那么我得到nan 作为第一列的平均值,并使用x[~np.isnan(x)] 过滤掉nan 值将数组展平为一维数组。

我需要使用旧版本的numpy,所以我不能使用numpy.nanmean

编辑:This comment 解释了为什么这不是发布的问题的重复

【问题讨论】:

  • @StefanoNardo 很好的发现。链接问答的答案帖子基本上建议使用numpy.ma.masked_array,我发现这不是有效的,或者以某种形式使用nanmean,OP 不能使用。鉴于这种情况,恕我直言,使用常规布尔数组进行屏蔽将是可行的方法。

标签: python arrays numpy nan


【解决方案1】:

一种方法是使用boolean-indexing -

def nanmean_cols(x):
    mask = ~np.isnan(x)
    x_masked = np.where(mask, x, 0)
    return x_masked.sum(0)/mask.sum(0)

示例运行 -

In [114]: x
Out[114]: 
array([[  1.,   2.,   3.],
       [  4.,   5.,   6.],
       [ nan,   8.,   9.]])

In [115]: np.nanmean(x,axis=0)
Out[115]: array([ 2.5,  5. ,  6. ])

In [117]: nanmean_cols(x)
Out[117]: array([ 2.5,  5. ,  6. ])

【讨论】:

    【解决方案2】:

    我想出了另一种不使用布尔索引的方法:

    means = []
    # Iterate over each column in x
    for col in x.T:
        filtered_vals = col[~np.isnan(col)]
        avg = np.mean(filtered_vals)
        means.append(avg)
    

    单行版本:

    means = [np.mean(col[~np.isnan(col)]) for col in x.T]
    

    【讨论】:

      猜你喜欢
      • 2023-02-18
      • 2019-06-25
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多