最近,我一直在尝试np.argsort,但我发现有些奇怪。

如果运行以下代码,将得到结果:

In [0]: np.argsort([3]*16)
Out[0]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],
      dtype=int64)


但是,如果您进行一些更改:

In [1]: np.argsort([3]*17)
Out[1]:
array([ 0, 14, 13, 12, 11, 10,  9, 15,  8,  6,  5,  4,  3,  2,  1,  7, 16],
      dtype=int64)


我知道numpy argsort的默认方法是quicksort,这是一种不稳定的排序算法。但是,上面有关于不同行为的合理解释吗?这是否与quicksort的支点选择有关?如果是这样,为什么?

最佳答案

我可能是错的,因为我没有对它进行深入研究,但是numpy似乎使用了introsort混合算法,对小范围使用了插入排序(稳定)。

猜猜看code应该可以为您提供更好的见解。查看代码可以遵循的不同路径,SMALL_QUICKSORT应该是您要查找的幻数。

关于python - numpy argsort不稳定性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49982804/

10-11 20:33