2010-05-14 1004 views
36

我需要一個從數組中返回非NaN值的函數。目前我做這種方式:numpy中的「isnotnan」功能,這可以更pythonic?

>>> a = np.array([np.nan, 1, 2]) 
>>> a 
array([ NaN, 1., 2.]) 

>>> np.invert(np.isnan(a)) 
array([False, True, True], dtype=bool) 

>>> a[np.invert(np.isnan(a))] 
array([ 1., 2.]) 

的Python:2.6.4 numpy的:1.3.0

,如果你知道一個更好的方法請分享, 謝謝

回答

77
a = a[~np.isnan(a)] 
21

你目前正在測試任何不是NaN的東西,而mtrw有正確的方法來做到這一點。如果您有興趣測試有限數(不楠是不是INF),那麼你並不需要一個反轉,並且可以使用:

np.isfinite(a) 

更Python和本地,很容易看懂,而且往往當你想避免NaN,你也想避免INF在我的經驗。

只是想我會把它扔給那裏的人。

+2

注意:如果你想使用isnotnan來過濾熊貓,這是要走的路。 – 2016-01-13 20:12:45

+0

@CharlieHayley不會'pd.notnull()'是大熊貓更好的選擇嗎? – 2018-02-27 22:16:44

+0

@JoshD。我檢查了代碼,pd.notnull()用於測試* objects *而不是數值,如果對象數組中的對象不是對象的實例,則返回負數。它將比np.isfinite()慢,但能夠處理任意對象數組(例如列表數組)。整潔的發現,如果你的數組可能包含任意對象,這是一個好主意。我認爲如果你可以確信你的數組通常是數字的,除了NaN和INF,那麼np.isfinite會更快,所以取決於用例。感謝您提出這個問題,我不認爲這是在發佈答案時。 – 2018-03-01 18:20:07