当前位置:  开发笔记 > 编程语言 > 正文

找到numpy数组的k个最小值的索引

如何解决《找到numpy数组的k个最小值的索引》经验,为你挑选了2个好方法。

为了找到最小值的索引,我可以使用argmin:

import numpy as np
A = np.array([1, 7, 9, 2, 0.1, 17, 17, 1.5])
print A.argmin()     # 4 because A[4] = 0.1

但是如何找到k-最小值的指数?

我正在寻找类似的东西:

print A.argmin(numberofvalues=3)   
# [4, 0, 7]  because A[4] <= A[0] <= A[7] <= all other A[i]

注意:在我的用例A中有大约10 000到100 000个值,我只对k = 10个最小值的索引感兴趣.k永远不会超过10.



1> unutbu..:

使用np.argpartition.它不会对整个数组进行排序.它只保证kth元素处于排序位置,所有较小的元素将在它之前移动.因此,第一个k元素将是k个最小元素.

import numpy as np

A = np.array([1, 7, 9, 2, 0.1, 17, 17, 1.5])
k = 3

idx = np.argpartition(A, k)
print(idx)
# [4 0 7 3 1 2 6 5]

这将返回k最小值.请注意,这些可能不是按排序顺序排列的.

print(A[idx[:k]])
# [ 0.1  1.   1.5]

要获得k最大值使用

idx = np.argpartition(A, -k)
# [4 0 7 3 1 2 6 5]

A[idx[-k:]]
# [  9.  17.  17.]

警告:不要(重新)使用idx = np.argpartition(A, k); A[idx[-k:]]以获得最大的k值.这并不总是有效.例如,这些不是以下3个最大值x:

x = np.array([100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0])
idx = np.argpartition(x, 3)
x[idx[-3:]]
array([ 70,  80, 100])

这是一个比较np.argsort,它也可以工作,但只是对整个数组进行排序以获得结果.

In [2]: x = np.random.randn(100000)

In [3]: %timeit idx0 = np.argsort(x)[:100]
100 loops, best of 3: 8.26 ms per loop

In [4]: %timeit idx1 = np.argpartition(x, 100)[:100]
1000 loops, best of 3: 721 µs per loop

In [5]: np.alltrue(np.sort(np.argsort(x)[:100]) == np.sort(np.argpartition(x, 100)[:100]))
Out[5]: True



2> CoryKramer..:

您可以使用numpy.argsort切片

>>> import numpy as np
>>> A = np.array([1, 7, 9, 2, 0.1, 17, 17, 1.5])
>>> np.argsort(A)[:3]
array([4, 0, 7], dtype=int32)


从其他评论来看,似乎`argsort`对整个集进行排序,所以我更喜欢使用`argpartition'的其他建议解决方案之一
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有