numpy argsort能否为领带返回较低的指数?

时间:2017-03-20 05:32:49

标签: python arrays numpy

我有一个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 个答案:

答案 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])