繁体   English   中英

MATLAB sort() vs Numpy argsort() - 如何匹配结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM