从numpy数组中获取最小的N值,忽略inf和nan

时间:2013-04-24 13:23:37

标签: python arrays math numpy

我需要一个好的,快速的方法来从一个numpy数组中找到10个最小的实数值,这个数组可能有任意多的nan和/或inf值。

我需要识别这些最小实际值的索引,而不是值本身。

我从numpy找到了argminnanargmin函数。他们并没有真正完成工作,因为我还想指定多于1个值,例如我想要最小的100个值。此外,它们都将-inf值返回为数组中存在的最小值。

heapq.nsmallest类似,但它也会将nan-inf值作为最小值返回。它也没有给我我正在寻找的指数。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:10)

应该抛出这个的唯一值是负无限值。所以试试:

import numpy as np
a = np.random.rand(20)
a[4] = -np.inf
k = 10
a[np.isneginf(a)] = inf
result = a[np.argsort(a)[:k]]

答案 1 :(得分:2)

在我看来,您可以从排序后的数组中取出第一个n有限值,而不是尝试修改原始数组,这可能很危险。

n = 10
b = np.sort(a)
smalls = b[np.isfinite(b)][n:]

答案 2 :(得分:1)

你可以找到infNan这样的索引:

a=np.array([[12,12,111],[np.inf,np.inf,1,2,3],[np.nan,7,8]])

您可以循环浏览a并查看:

for item in a:    
    idxInf=(np.isnan(a[item])).nonzero()
    idxNan=(np.isnan(a[item])).nonzero()

即:

In [17]: (np.isnan(a[2]))
Out[17]: array([ True, False, False], dtype=bool)

In [18]: (np.isnan(a[2])).nonzero()
Out[18]: (array([0]),)