有没有更好的方法让numpy.argmin()忽略NaN值

25 投票
1 回答
16221 浏览
提问于 2025-04-15 22:38

我想要找到一个包含NaN(不是数字)的numpy数组中最小值的索引,并且希望忽略这些NaN。

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

如果我直接使用argmin,它会返回第一个NaN的索引。

>>> a.argmin()  
0  

我把NaN替换成无穷大(Infs),然后再用argmin。

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

我面临的困境是:我不想把NaN改成无穷大,然后在用完argmin后再改回来,因为在后面的代码中,NaN是有意义的。有没有更好的方法呢?

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

1 个回答

57

当然可以!使用 nanargmin

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 的方法,可以看看 掩码数组

撰写回答