我有一个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)。如何有效地实现这一点?
那么简单点呢?
(-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 否
>>> 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])
kind='stable'
进行调用,让 numpy 选择一个稳定的算法,最适合你的数据。 - Jitse