2013-04-24 134 views
7

我需要一个很好的快速方法来从numpy数组中找到10个最小的实数值,该值可以具有任意多个nan和/或inf值。从numpy数组中获得最小的N值,忽略inf和nan

我需要确定这些最小实数值的索引,而不是数值本身。

我找到了numpy的argminnanargmin函数。他们并没有真正完成工作,因为我也想指定多个值,比如我想要最小的100个值。并且它们都返回-inf值,因为它在数组中存在时是最小的值。

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

在这里的任何帮助将不胜感激。

+0

迭代/复制数组,将所有nans和-inf转换为inf运行你的函数以获得最小N值,将它们转换回/还原为旧副本?愚蠢的哈克,但嗯... – Patashu 2013-04-24 13:27:39

+0

感谢您的帮助,这是我将不得不做的,如果我不能得到一个更简单的答案。 – 2013-04-24 13:29:53

回答

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 * np.max'不起作用,我认为使用'inf'更好。 – interjay 2013-04-24 13:41:52

+0

是啊,我只是让它inf – 2013-04-24 13:43:00

+0

是的,好点.. – YXD 2013-04-24 13:43:15

1

你可以找到infNan指数是这样的:

​​

即:

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

的,你可以通过a循环,并与检查

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]),) 
2

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

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