代码之家  ›  专栏  ›  技术社区  ›  vahlala aName

在不使用NumPy.nanmean的情况下,沿NumPy数组中的列忽略nan

  •  1
  • vahlala aName  · 技术社区  · 8 年前

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

    np.mean(x, axis=0) ,然后我得到 nan x[~np.isnan(x)] 过滤掉

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

    编辑: This comment

    2 回复  |  直到 8 年前
        1
  •  2
  •   Divakar    8 年前

    一种方法是使用 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
  •  0
  •   vahlala aName    8 年前

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

    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]