Python R和Numpy中的排序
我正在尝试将一些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=[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