2017-06-27 98 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]