Domanda

Voglio ottenere l'indice del valore minimo di una matrice che contiene NumPy NaNs e voglio li ignorate

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

se corro argmin, restituisce l'indice del primo NaN

>>> a.argmin()  
0  

I sostituire NaNs con Infs e quindi eseguire argmin

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

Il mio dilemma è il seguente: preferirei non cambiare NaNs a Infs e poi di nuovo dopo che ho fatto con argmin (dal NaNs hanno un significato più avanti nel codice). C'è un modo migliore per fare questo?

V'è anche una questione di ciò che dovrebbe essere il risultato se tutti i valori originali di a sono NaN? Nella mia implementazione la risposta è 0

È stato utile?

Soluzione

Certo! Uso nanargmin:

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

C'è anche nansum, nanmax, nanargmax, e nanmin,

In scipy.stats, c'è nanmean e nanmedian.

Per ulteriori modi per ignorare nans, controllare mascherato array .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top