2010-05-12 18 views
14

Quiero obtener el índice del valor mínimo de una matriz que contiene numpy NaNs y quiero que ignoran¿Hay una mejor manera de hacer numpy.argmin() ignorar los valores NaN

>>> a = array([ nan, 2.5, 3., nan, 4., 5.]) 
>>> a 
array([ NaN, 2.5, 3. , NaN, 4. , 5. ]) 

si funciono argmin, devuelve el índice de la primera NaN

>>> a.argmin() 
0 

sustituyo NaNs con Infs y luego ejecutar argmin

>>> a[isnan(a)] = Inf 
>>> a 
array([ Inf, 2.5, 3. , Inf, 4. , 5. ]) 
>>> a.argmin() 
1 

Mi dilema es el siguiente: Preferiría no cambiar NaNs a Infs y luego volver luego de haber terminado con argmin (ya que los NaN tienen un significado más adelante en el código). ¿Hay una mejor manera de hacer esto?

También hay una cuestión de ¿cuál debería ser el resultado si todos los valores originales de a son NaN? En mi implementación la respuesta es 0

Respuesta

27

¡Claro! Utilice nanargmin:

import numpy as np 
a = np.array([ np.nan, 2.5, 3., np.nan, 4., 5.]) 
print(np.nanargmin(a)) 
# 1 

También hay nansum, nanmax, nanargmax, y nanmin,

En scipy.stats, hay nanmean y nanmedian.

For more ways para ignorar nan s, consultar masked arrays.

+0

Gracias ~ unutbu! –

+0

No tienes idea de lo feliz que me siento. – weronika

Cuestiones relacionadas