2017-06-27 78 views
1

我有一个numpy的阵列类似如下:平均忽略沿着在NumPy的阵列列的NaN而不使用numpy.nanmean

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

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

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

编辑:This comment解释了为什么这不是贴

+1

的可能的复制[NumPy的:计算与NaN的平均去除(https://开头计算器.com/questions/5480694/numpy-calculate-averages-with-nans-removed) –

+1

@StefanoNardo好找。链接问答的帖子基本上建议使用'numpy.ma.masked_array',我没有发现它是有效的,或者以某种形式使用'nanmean',这是OP不能使用的。鉴于这种情况,恕我直言,使用普通的布尔数组进行掩蔽将是一条可行的路。 – Divakar

回答

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. ]) 
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]