numpy argsort 可以返回较低的关系索引吗?

whi*_*ids 5 python arrays numpy

我有一个 numpy 数组:

foo = array([3, 1, 4, 0, 1, 0])
Run Code Online (Sandbox Code Playgroud)

我想要前 3 项。打电话

foo.argsort()[::-1][:3]
Run Code Online (Sandbox Code Playgroud)

返回

array([2, 0, 4])
Run Code Online (Sandbox Code Playgroud)

注意值foo[1]foo[4]是相等的,所以numpy.argsort()通过返回数组中最后出现的项目的索引来处理平局;即索引 4。

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

Jul*_*ien 6

简单的这个又如何呢?

\n
(-foo).argsort(kind=\'mergesort\')[:3]\n
Run Code Online (Sandbox Code Playgroud)\n

为什么这有效:

\n

arg 降序排序(不是做什么)与 arg 升序排序(做什么)相反的值np.argsort相同。np.argsort然后您只需选择前 3 个排序索引。现在您需要的是确保排序是稳定的,这意味着在出现平局的情况下,首先保留第一个索引。\n注意:我认为默认值是稳定的,kind=quicksort但从文档来看,它似乎只能kind=mergesort保证稳定:(https:/ /docs.scipy.org/doc/numpy/reference/ generated/numpy.sort.html )

\n
\n

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

\n

速度最差情况工作空间稳定

\n

\xe2\x80\x98quicksort\xe2\x80\x99 1 O(n^2) 0 否

\n

\xe2\x80\x98mergesort\xe2\x80\x99 2 O(n*log(n)) ~n/2 是

\n

\xe2\x80\x98heapsort\xe2\x80\x99 3 O(n*log(n)) 0 否

\n
\n