2010-05-14 7 views
36

J'ai besoin d'une fonction qui renvoie des valeurs non-NaN d'un tableau. Actuellement, je fais de cette façon:fonctionnalité "isnotnan" en numpy, cela peut-il être plus pythonique?

>>> 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

S'il vous plaît partager si vous connaissez une meilleure façon, Merci

Répondre

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

Vous sont en train de tester pour tout ce qui n'est pas NaN et mtrw a la bonne façon de le faire. Si vous êtes intéressé par les tests pour les nombres finis (n'est pas NaN et ne INF) alors vous n'avez pas besoin d'inversion et peut utiliser:

np.isfinite(a) 

Plus pythonique et natif, d'une lecture facile, et souvent lorsque vous voulez éviter NaN, vous voulez également éviter INF dans mon expérience.

Juste pensé que je jetterais là-bas pour les gens.

+2

Note: Si vous voulez utiliser isnotnan pour filtrer les pandas, c'est la voie à suivre. –

+0

@CharlieHayley ne serait pas "pd.notnull()" être une bien meilleure option pour les pandas? –

+0

@JoshD. J'ai vérifié le code et pd.notnull() est pour tester * objets * au lieu de valeurs numériques, renvoyant négatif si un objet dans un tableau d'objet n'est pas une instance d'un objet. Il sera plus lent que np.isfinite() mais est capable de gérer des tableaux d'objets arbitraires (par exemple des tableaux de listes). Une bonne recherche, et une bonne idée si votre tableau peut inclure des objets arbitraires. Je pense que si vous pouvez être sûr que votre tableau est généralement numérique, sauf pour NaN et INF, alors np.isfinite serait plus rapide, donc dépend du cas d'utilisation. Merci d'avoir soulevé la question, je ne pense pas que c'était à l'époque où la réponse a été affichée. –

Questions connexes