2013-04-24 30 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:]