2010-05-14 15 views
36

Bir diziden NaN olmayan değerler döndüren bir işleve ihtiyacım var."isnotnan" işlevselliği, bu daha pitonik olabilir?

>>> 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: Eğer daha iyi bir yol biliyorsanız 1.3.0

paylaşın, teşekkür ederiz

cevap

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

You Şu anda bu şekilde yapıyorum Şu anda NaN olmayan ve mtrw'nin bunu yapmak için doğru yolu olan her şeyi test ediyorlar. Eğer sonlu sayılar için test ilgileniyorsanız (NaN değildir ve INF değildir) o zaman bir ters çevirmeyi gerekmez ve kullanabilirsiniz:

np.isfinite(a) 

daha pythonic ve yerli, kolay bir okuma ve genellikle zaman sizi NaN'den kaçınmak istiyorum, ayrıca deneyimime INF'den kaçınmak istiyorsunuz.

Sadece bunu insanlar için dışarı atabileceğimi düşündüm.

+2

Not: Eğer pandaları filtrelemek için isnotnan kullanmak istiyorsanız, işte bu yoldur. –

+0

@CharlieHayley pd.notnull() 'pandalar için çok daha iyi bir seçenek değil miydi? –

+0

@JoshD. Kodu kontrol ettim ve pd.notnull() bir nesne dizisindeki bir nesne bir nesnenin bir örneği değilse, negatif değerler döndürerek sayısal değerler yerine * nesneleri * test etmek için kullanılır. Np.isfinite() 'den daha yavaş olacaktır, ancak isteğe bağlı nesne dizilerini (örneğin, listeler dizileri) idare edebilmektedir. Düzgün bul ve dizinin keyfi nesneleri içerebilir eğer iyi bir fikir. Eğer dizinin NaN ve INF dışında sayısal olarak sayısal olduğuna emin olursanız, np.isfinite daha hızlı olur, dolayısıyla kullanım durumuna bağlıdır. Onu getirdiğin için teşekkürler, cevabın yayınlandığı zaman etrafta olduğunu sanmıyorum. –

İlgili konular