Numpy的argsort确定性吗?

时间:2016-09-12 09:26:04

标签: python sorting numpy

我们说我有一堆要排序的对象,其中一些具有相同的排序标准。我可以确定numpy.argsort()每次会产生相同的回报吗?

例如,如果我致电argsort([0,0,1]),它会返回:

  • [0,1,2]

  • [1,0,2]

  • 取决于?

1 个答案:

答案 0 :(得分:6)

numpy.sort() function(从numpy.argsort() page链接)

记录了这一点

排序是否稳定取决于您选择的排序算法。默认使用quicksort,快速排序稳定排序。如果必须具有稳定的排序,请改为使用kind='mergesort'

kind        speed   worst case  work space  stable
‘quicksort’ 1       O(n^2)      0           no
‘mergesort’ 2       O(n*log(n)) ~n/2        yes
‘heapsort’  3       O(n*log(n)) 0           no

对于特定的示例,quicksort返回[0, 1, 2],mergesort也是如此。 Heapsort返回[1, 0, 2]代替:

>>> from numpy import argsort
>>> argsort([0,0,1])
array([0, 1, 2])
>>> argsort([0,0,1], kind='mergesort')
array([0, 1, 2])
>>> argsort([0,0,1], kind='heapsort')
array([1, 0, 2])

但是,给定相同的输入,每个排序算法将再次生成相同的输出。您不会随机查看使用给定算法在运行之间交换的10,即使它是不稳定的。不稳定性并不意味着随机性,它只是意味着具有相同排序键的值的输入顺序可能最终被交换。交换值时完全是确定性的。

另请参阅Wikipedia关于排序算法的文章的stability section