numpy提出了一种通过np.argmax获取数组最大值索引的方法。
我想要一个类似的东西,但是返回N最大值的索引。
例如,如果我有一个数组,[1, 3, 2, 4, 5]和function(array, n=3)将返回对应于元素[5, 4, 3]的索引[4, 3, 1]。
python+numpy的可能副本:从矩阵中获取最小/最大n值和索引的有效方法
你的问题不是很清楚。例如,对于array([5, 1, 5, 5, 2, 3, 2, 4, 1, 5]),您期望的指数是什么,而n= 3?所有的选择中,哪一个是正确的,如[0, 2, 3]、[0, 2, 9]、...?请详细说明您的具体要求。谢谢
@吃吧,我真的不在乎在这个特定的情况下应该退回哪一个。即使返回遇到的第一个似乎合乎逻辑,这对我来说也不是一个要求。
如果你不关心归还的不雅物品的顺序,argsort可能是一个可行的选择。请看下面我的答案。
新的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 logk)时间。
实际上,必须是O(n lg k)时间。无法想象O(n+k lg k)是怎样的
@varela argpartition使用introselect算法,以线性时间o(n)运行。随后的排序只处理k元素,因此在o(k log k)中运行。
如果有人想知道np.argpartition和它的姊妹算法np.partition的工作原理是什么,在链接的问题中有一个更详细的解释:stackoverflow.com/questions/10337533/…
@弗雷德福:你为什么用-4?你这样做是为了从后面开始吗?(因为K是积极的或消极的,对我也一样!它只先打印最小的数字!
运行:{import numpy as np a = [9, 4, 4, 3, 3, 9, 0, 4, 6, 0] ind = np.argpartition(a, -4)[-4:] a[ind]}现在抛出这个错误。江户十一〔16〕号
@LKT使用a=np.array([9, 4, 4, 3, 3, 9, 0, 4, 6, 0]),因为与np.array不同,普通的python列表不支持按列表进行索引。
是的。佛瑞德.福的高调回答应该有这样一个小而关键的编辑。
如何使用此方法查找矩阵每行前n个值的索引?
@Umangsinghal-np.argpartition采用了可选的axis论证。查找每行前n个值的索引:np.argpartition(a, -n, axis=1)[-n:]。
我能想到的最简单的方法是:
In [1]: import numpy as np
In [2]: arr = np.array([1, 3, 2, 4, 5])
In [3]: arr.argsort()[-3:][::-1]
Out[3]: array([4, 3, 1])
这涉及到一种完整的数组。我想知道numpy是否提供了一种内置的方法来进行部分排序;到目前为止,我还没有找到一种。
如果这个解决方案的速度太慢(特