python 数组最大值的索引_关于python:如何在NumPy数组中获得N个最大值的索引?...

本文介绍了在Python的numpy库中如何获取数组中N个最大值的索引。通过使用np.argmax、np.argpartition和heapq.nlargest等方法,可以有效地找到最大值的索引。讨论了不同方法的效率和适用场景,提供了多种实现示例,包括处理多维数组的情况。
摘要由CSDN通过智能技术生成

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是否提供了一种内置的方法来进行部分排序;到目前为止,我还没有找到一种。

如果这个解决方案的速度太慢(特

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值