我需要一个好的,快速的方法来从一个numpy数组中找到10个最小的实数值,这个数组可能有任意多的nan
和/或inf
值。
我需要识别这些最小实际值的索引,而不是值本身。
我从numpy找到了argmin
和nanargmin
函数。他们并没有真正完成工作,因为我还想指定多于1个值,例如我想要最小的100个值。此外,它们都将-inf
值返回为数组中存在的最小值。
heapq.nsmallest
类似,但它也会将nan
和-inf
值作为最小值返回。它也没有给我我正在寻找的指数。
非常感谢任何帮助。
答案 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)
你可以找到inf
和Nan
这样的索引:
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]),)