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

2022-10-21 08:48:51

本文翻译自:How do I get indices of N maximum values in a NumPy array?

NumPy proposes a way to get the index of the maximum value of an array vianp.argmax .NumPy提出了一种通过np.argmax数组最大值的索引的np.argmax

I would like a similar thing, but returning the indexes of theN maximum values.我想要类似的事情,但是返回N最大值的索引。

For instance, if I have an array,[1, 3, 2, 4, 5] ,function(array, n=3) would return the indices[4, 3, 1] which correspond to the elements[5, 4, 3] .例如,如果我有一个数组[1, 3, 2, 4, 5] ,则function(array, n=3)将返回对应于元素[5, 4, 3]的索引[4, 3, 1] 4,3,1[4, 3, 1][5, 4, 3]


#1楼

参考:https://stackoom.com/question/Szlx/如何获取NumPy数组中N个最大值的索引


#2楼

Use:采用:

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

For regular Python lists:对于常规的Python列表:

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

If you use Python 2, usexrange instead ofrange .如果使用Python 2,请使用xrange而不是range

Source:heapq — Heap queue algorithm来源:heapq —堆队列算法


#3楼

Newer NumPy versions (1.8 and up) have a function calledargpartition for this.较新的NumPy版本(1.8及更高版本)具有一个称为argpartition的函数。To get the indices of the four largest elements, do要获取四个最大元素的索引,请执行

>>> 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])

Unlikeargsort , this function runs in linear time in the worst case, but the returned indices are not sorted, as can be seen from the result of evaluatinga[ind] .argsort不同,此函数在最坏的情况下以线性时间运行,但是返回的索引未排序,从评估a[ind]的结果可以看出。If you need that too, sort them afterwards:如果您也需要它,请对它们进行排序:

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

To get the top-k elements in sorted order in this way takes O(n +k logk ) time.要以这种方式获得排序前k个元素,需要O(n +k logk )时间。


#4楼

Simpler yet:更简单了:

idx = (-arr).argsort()[:n]

wheren is the number of maximum values.其中,n是最大值的数量。


#5楼

Use:采用:

from operator import itemgetter
from heapq import nlargest
result = nlargest(N, enumerate(your_list), itemgetter(1))

Now theresult list would containN tuples (index ,value ) wherevalue is maximized.现在result列表将包含N个元组(indexvalue ),其中value最大化。


#6楼

If you don't care about theorder of the K-th largest elements you can useargpartition , which should perform better than a full sort throughargsort .如果您不关心第K个最大元素的顺序 ,则可以使用argpartition ,它的性能要比通过argsort进行完整排序argsort

K = 4 # We want the indices of the four largest values
a = np.array([0, 8, 0, 4, 5, 8, 8, 0, 4, 2])
np.argpartition(a,-K)[-K:]
array([4, 1, 5, 6])

Credits go tothis question .学分到这个问题

I ran a few tests and it looks likeargpartition outperformsargsort as the size of the array and the value of K increase.我进行了一些测试,随着数组的大小和K值的增加,argpartition表现优于argsort

  • 作者:asdfgh0077
  • 原文链接:https://blog.csdn.net/asdfgh0077/article/details/106079083
    更新时间:2022-10-21 08:48:51