我有一个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)。如何有效地实现这一目标?
答案 0 :(得分:3)
这是怎么回事?
(-foo).argsort(kind='mergesort')[:3]
为什么会这样:
按降序排序(不是np.argsort
所做的)与按升序排序(np.argsort
做什么)相反的值相同。然后,您只需要选择前3个排序索引。现在您只需要确保排序是稳定的,这意味着在绑定的情况下,首先保留第一个索引。
注意:我认为默认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 no
答案 1 :(得分:0)
这是一个非常讨厌的答案,但为什么你不反过来对阵阵?这样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])