2012-12-09 64 views
1

可能重複:
NumPy: calculate averages with NaNs removed點態陣列平均忽略的NaN

我有幾個相同形狀的numpy的陣列。我想用小小的扭曲來計算他們的點平均值:在平均值中應忽略np.nan值。換句話說,average(np.array([1,2,3]), np.array([5,np.nan,7]), np.array([np.nan, 4, 2])應該等於np.array([3,3,4])

當然,我可以通過遍歷每個numpy數組中的元素來做到這一點,但我希望避免它。有沒有更好的方法來實現這個功能?

(Python 3中,但我懷疑它很重要。)

+2

你想要的東西已經在這裏得到解答:http://stackoverflow.com/questions/5480694/numpy-calculate-averages-with-nans-removed – HerrKaputt

+0

@HerrKaputt對不起,它當然有...我有點相信自己沒有人會試圖這樣做,所以我沒有仔細搜索現有的問題:( – max

+0

沒有必要道歉!事實上,我不認爲海登的答案(使用nanmean)在其他鏈接中提到... – HerrKaputt

回答

4

您可以使用scipy.statnanmean

import numpy as np 
from scipy.stats import nanmean 
s = np.array([[1.0, 2.0, 3.0], [5.0, np.nan, 7.0], [np.nan, 4.0, 2.0]]) 

In [4]: nanmean(s) 
Out[4]: array([ 3., 3., 4.]) 

@Dougal在評論中指出,bottleneck包,裏面有顯著幾個numpy/scipy函數的更快實現包括一個nanmean

+3

請注意,[瓶頸包](http://pypi.python.org/pypi/Bottleneck)具有'bottleneck.nanmean',其運行速度比scipy.stats快10-30倍。 nanmean'。 – Dougal

+0

@Dougal有用的信息! –

1

您還可以將數組轉換成masked array(屏蔽所有fix_invalid的NaN的),而且執行的操作:

new_array = np.ma.fix_invalid(my_array) 
print np.mean(new_array) 

如果它只是平均值,那麼建議nanmean通過@hayden是大約快4倍。但是如果你想在陣列上進行其他操作,最好使用掩碼數組。