为了账号安全,请及时绑定邮箱和手机立即绑定

如何在NumPy数组中获得N个最大值的索引?

如何在NumPy数组中获得N个最大值的索引?

慕标5832272 2019-07-02 15:47:55
如何在NumPy数组中获得N个最大值的索引?NumPy提出了一种方法,通过np.argmax.我想要一个类似的东西,但是返回N最大值。例如,如果我有一个数组,[1, 3, 2, 4, 5], function(array, n=3)会返回指数[4, 3, 1]与元素对应的[5, 4, 3].
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

我想出的最简单的方法是:

In [1]: import numpy as npIn [2]: arr = np.array([1, 3, 2, 4, 5])In [3]: arr.argsort()[-3:][::-1]Out[3]: array([4, 3, 1])

这涉及到一个完整的数组类型。我想知道numpy提供一个内置的方式来进行部分排序;到目前为止,我还没有找到一个。

如果这个解决方案被证明太慢(特别是对于小型的)n),可能值得考虑一下在Cython.


查看完整回答
反对 回复 2019-07-02
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

更新的NumPy版本(1.8及以上)有一个名为argpartition为了这个。要获得四大元素的指数,请执行以下操作

>>> a = np.array([9, 4, 4, 3, 3, 9, 0, 4, 6, 0])>>> a
array([9, 4, 4, 3, 3, 9, 0, 4, 6, 0])>>> ind = np.argpartition(a, -4)[-4:]>>> ind
array([1, 5, 8, 0])>>> a[ind]array([4, 9, 6, 9])

不像argsort,该函数在最坏的情况下以线性时间运行,但返回的索引没有排序,从计算结果可以看出。a[ind]..如果你也需要的话,把它们整理一下:

>>> ind[np.argsort(a[ind])]array([1, 8, 5, 0])

为了得到最高层-k按排序顺序排列的元素以这种方式取O(n + k原木k)时间。


查看完整回答
反对 回复 2019-07-02
?
心有法竹

TA贡献1866条经验 获得超5个赞

用途:

>>> import heapq>>> import numpy>>> a = numpy.array([1, 3, 2, 4, 5])>>> heapq.nlargest(3, range(len(a)), a.take)[4, 3, 1]

对于常规Python列表:

>>> a = [1, 3, 2, 4, 5]>>> heapq.nlargest(3, range(len(a)), a.__getitem__)[4, 3, 1]

如果使用Python 2,请使用xrange而不是range.

资料来源:堆队列算法


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 7185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信