有没有更好的方法让numpy.argmin()忽略NaN值
我想要找到一个包含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
还有 nansum
、nanmax
、nanargmax
和 nanmin
,
在 scipy.stats
里,有 nanmean
和 nanmedian
。
想了解更多忽略 nan
的方法,可以看看 掩码数组。