意味着忽略NumPy数组中的列的NaN而不使用numpy.nanmean

时间:2017-06-27 13:25:53

标签: python arrays numpy nan

我有一个如下所示的numpy数组:

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

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

我需要使用较旧版本的numpy,因此我无法使用numpy.nanmean

修改:This comment解释了为什么这不是发布的问题的副本

2 个答案:

答案 0 :(得分: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. ])

答案 1 :(得分:0)

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

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]