关于数组:有没有更好的方法使numpy.argmin()忽略NaN值

Is there a better way of making numpy.argmin() ignore NaN values

我想得到包含NaN的numpy数组的最小值的索引,我希望它们被忽略

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

如果我运行argmin,它将返回第一个NaN的索引

1
2
>>> a.argmin()  
0

我用Infs代替NaNs然后运行argmin

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

我的困境如下:我宁愿不将NaNs改为Infs然后在我完成argmin后再回来(因为NaNs后来在代码中有意义)。 有一个更好的方法吗?

还有一个问题是,如果a的所有原始值都是NaN,结果应该是什么? 在我的实现中,答案是0


当然! 使用nanargmin

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

还有nansumnanmaxnanargmaxnanmin

scipy.stats中,有nanmeannanmedian

有关忽略nan的更多方法,请查看屏蔽数组。