NumPy的argsort函数能否返回并列元素的较小索引?

7

我有一个numpy数组:

foo = array([3, 1, 4, 0, 1, 0])

我想要前三个项目。调用。
foo.argsort()[::-1][:3]

返回
array([2, 0, 4])

注意值foo [1]foo [4]相等,因此numpy.argsort()通过返回出现在数组中最后一个项目的索引来处理关系; 即索引4。

对于我的应用程序,我希望打破平局并返回出现在数组中第一个项目的索引(这里是索引1)。如何有效地实现这一点?

2个回答

6

那么简单点呢?

(-foo).argsort(kind='mergesort')[:3]

为什么这个方法可行:

按降序排序(与np.argsort不同)的argsort与按升序排序(即np.argsort所做的)相同,只是相反的值。然后你只需要选择前三个排序后的索引。现在,你需要确保排序是稳定的,也就是说,在出现绑定的情况下,保持第一个索引在前面。 注意:我认为默认的kind=quicksort是稳定的,但从文档中看到似乎只有kind=mergesort保证是稳定的:https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html

各种排序算法的特点是平均速度、最坏情况性能、工作空间大小以及它们是否稳定。稳定排序使具有相同关键字的项保持相同的相对顺序。三种可用的算法具有以下属性:

类型 速度 最坏情况 工作空间 稳定性

'quicksort' 1 O(n^2) 0 否

'mergesort' 2 O(n*log(n)) ~n/2 是

'heapsort' 3 O(n*log(n)) 0 否


你也可以使用 kind='stable' 进行调用,让 numpy 选择一个稳定的算法,最适合你的数据。 - Jitse

2
这是一个非常不规范的答案,但为什么不反向argsort数组呢?这样argsort就会选择最后一个索引(反向),即第一个索引。
这相当于:
>>> foo = np.array([3, 1, 4, 0, 1, 0])
>>> foo.argsort()[::-1]
array([2, 0, 4, 1, 5, 3])
>>> foo.size - 1 - foo[::-1].argsort()[::-1]
array([2, 0, 1, 4, 3, 5])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接