Pergunta

Eu quero obter o índice do valor mínimo de uma matriz numpy que contém Nans e eu quero que eles sejam ignorados

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

Se eu correr argmin, ele retorna o índice da primeira nan

>>> a.argmin()  
0  

Eu substituo Nans pelo INFS e depois corro Argmin

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

Meu dilema é o seguinte: Prefiro não mudar de Nans para o INFS e depois voltar depois de terminar o Argmin (já que os Nans têm um significado mais tarde no código). Existe uma maneira melhor de fazer isso?

Há também uma questão de qual deve ser o resultado se todos os valores originais de uma são nan? Na minha implementação, a resposta é 0

Foi útil?

Solução

Claro! Usar nanargmin:

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

Há também nansum, nanmax, nanargmax, e nanmin,

Dentro scipy.stats, há nanmean e nanmedian.

Para mais maneiras ignorar nans, confira Matrizes mascaradas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top