7

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

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

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

heapq.nsmallest有点工作,但它也返回nan-inf值作为最小值。它也没有给我我正在寻找的索引。

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

4

3 回答 3

11

唯一应该丢弃的值是负无限值。所以试试:

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]]
于 2013-04-24T13:35:24.580 回答
2

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

n = 10
b = np.sort(a)
smalls = b[np.isfinite(b)][n:]
于 2013-04-25T01:25:36.833 回答
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()

IE:

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]),)
于 2013-04-24T13:41:20.910 回答