![](/img/trans.png)
[英]How to sort a list based on the output of numpy's argsort function
[英]MATLAB sort() vs Numpy argsort() - how to match results?
我正在将 MATLAB 代码移植到 Python 的 Numpy。
在 MATLAB(实际上是 Octave)中,我有类似的东西:
>> someArr = [9, 8, 7, 7]
>> [~, ans] = sort(someArr, 'descend')
ans =
1 2 3 4
所以在 Numpy 我正在做:
>>> someArr = np.array([9, 8, 7, 7])
>>> np.argsort(someArr)[::-1]
array([0, 1, 3, 2])
我在 MATLAB 中得到1, 2, 3, 4
而在 Numpy 上得到0, 1, 3, 2
,而我在 Numpy 上需要0, 1, 2, 3
。
我相信这是由于每个函数中使用的排序算法,但我检查过,看起来两者都在使用“快速排序”(参见此处和此处)。
如何将 Numpy 的解决方案与 MATLAB 的解决方案相匹配?
为了使这项工作有效,我们需要稍微聪明一点。 numpy
没有'descend'
类似物。 您通过反转排序结果来模仿它(最终您要撤消操作)。
我不确定matlab
如何完成它,但是他们声称使用了quicksort的稳定变体 。 具体来说,对于降序排序:
如果标志为“下降”,则在返回输出之前将其反转。 反转之后,我们对索引向量进行了排序以恢复稳定性。
octave
似乎在这里也一样。
由于它们的排序是稳定的,因此可以保证输入中相等值的顺序将保留在输出中。 另一方面, numpy
对其numpy
并没有这样的保证。 如果我们想在numpy中进行稳定排序,则需要使用mergesort
:
>>> np.argsort(someArr, kind='mergesort')
array([2, 3, 1, 0])
好的,此输出很有意义。 someArr[2] == someArr[3]
并且第三个元素在第四个元素之前,因此明智的做法是在输出中2
会在3
之前(如果没有保证的稳定排序算法,我们无法提出此主张)。 现在是明智的一步……您想要“降序”值,而不是反转argsort
的输出,为什么不argsort
反呢? 与降序排序相比,这将产生比低序排序更大的数字排序的效果...
>>> np.argsort(-someArr, kind='quicksort')
array([0, 1, 2, 3])
现在我们在说话! 而且由于可以保证mergesort是稳定的,因此出现在较低索引处的元素(具有相等值)将首先出现在输出中-就像matlab / octave一样。 真好
您可以选择不同的排序算法。 将其更改为heapsort
对我heapsort
:
>> np.argsort(someArr, kind="heapsort")[::-1]
array([0, 1, 2, 3], dtype=int32)
编辑:这仅适用于我看过的几个测试用例。 对于[9, 8, 7, 7, 4, 1, 1]
它停止工作。 我的答案可能不是一个好的解决方案。
np.argsort(dataset,axis=-1,kind='stable')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.