Python R和Numpy中的排序

Python R和Numpy中的排序,python,r,numpy,Python,R,Numpy,我正在尝试将一些R代码转换成numpy。我有一个向量,如下所示: r=[2.00000 1.64000 1.36000 1.16000 1.04000 1.00000 1.64000 1.28000 1.00000 0.80000 0.68000 0.64000 1.36000 1.00000 0.72000 0.52000 0.40000 0.36000 1.16000 0.

我正在尝试将一些R代码转换成numpy。我有一个向量,如下所示:

   r=[2.00000
   1.64000
   1.36000
   1.16000
   1.04000
   1.00000
   1.64000
   1.28000
   1.00000
   0.80000
   0.68000
   0.64000
   1.36000
   1.00000
   0.72000
   0.52000
   0.40000
   0.36000
   1.16000
   0.80000
   0.52000
   0.32000
   0.20000
   0.16000
   1.04000
   0.68000
   0.40000
   0.20000
   0.08000
   0.04000
   1.00000
   0.64000
   0.36000
   0.16000
   0.04000
   0.00000]
我正在尝试转换下面的R代码

index <- order(r)
以下是结果

努比

R


正如你所看到的,结果是不同的。如何在numpy中获得R的结果

查看的文档,似乎
R
对短向量使用基数排序,这确实是一种稳定的排序。另一方面,默认情况下使用快速排序,这不是一种稳定的排序,并且不能保证绑定与原始数组的顺序相同

但是,通过指定
kind
标志,可以将稳定排序与
argsort
一起使用:

np.argsort(r, kind='stable')
当我对向量使用稳定排序时:

array([35, 29, 34, 28, 23, 33, 22, 27, 21, 17, 32, 16, 26, 15, 20, 11, 31,
       10, 25, 14,  9, 19,  5,  8, 13, 30,  4, 24,  3, 18,  7,  2, 12,  1,
        6,  0], dtype=int64)
r
结果相比(索引差异减去1):



一句警告:在某些情况下,
r
似乎会切换到shell排序(我对
r
了解不够,无法给出更详细的说明),但shell排序不稳定。如果满足这些条件,您必须解决这一问题。

请记住
r
向量是一个索引,而
numpy
数组是0索引的。首先,请确认您正在使用这两种语言进行稳定排序。我知道索引的差异。看看结果中的第四个元素。你可以看到这是我评论的第二部分。排序以不同的方式处理关联,一些是稳定的(在关联的情况下保持原始数组的顺序),其他则不是
argsort
允许您使用稳定排序
argsort(r,kind='stable')
。我对
r
知之甚少,不知道它使用哪种算法您可以强制
order
使用r中的基数排序,顺序为
order(r,method='radix')
来自
?order
:默认值('auto')表示短数值向量、整数向量的'radix',逻辑向量和因子。否则,它意味着“shell”。短向量是指最多包含2^31-1个元素的向量。。。我不知道在很长的向量上使用基数排序对性能的影响…@BenBolker如果我不得不猜测的话,它归结为非常大的输入的空间复杂性比其他任何东西都重要。对于基数排序,Shell排序是O(1)对O(n+k)
index= [36 30 35 29 24 34 23 28 22 18 33 17 27 16 21 12 32 11 26 15 10 20  6  9 14 31  5 25  4 19  8  3 13  2  7  1]
np.argsort(r, kind='stable')
array([35, 29, 34, 28, 23, 33, 22, 27, 21, 17, 32, 16, 26, 15, 20, 11, 31,
       10, 25, 14,  9, 19,  5,  8, 13, 30,  4, 24,  3, 18,  7,  2, 12,  1,
        6,  0], dtype=int64)
np.array_equal(np.argsort(r, kind='stable'), r_out - 1)
True