在R和Numpy中排序

use*_*257 3 python numpy r

我试图将一些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]
Run Code Online (Sandbox Code Playgroud)

我正在尝试转换以下R代码

index <- order(r)
Run Code Online (Sandbox Code Playgroud)

通过以下代码进入numpy

index = np.argsort(r)
Run Code Online (Sandbox Code Playgroud)

结果如下

NumPy的

index=array([35, 29, 34, 28, 33, 23, 27, 22, 21, 32, 17, 16, 26, 15, 20, 11, 31,25, 10, 14,  9, 19, 30,  5,  8, 13,  4, 24, 18,  3,  7, 12,  2,  6, 1,  0])
Run Code Online (Sandbox Code Playgroud)

[R

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]
Run Code Online (Sandbox Code Playgroud)

如您所见,结果不同.如何在numpy中获得R的结果

use*_*203 7

看看文档order,看起来像是r使用基数排序的短向量,这确实是一个稳定的排序. argsort另一方面,默认情况下使用快速排序,这不是一个稳定的排序,并且不保证绑定与原始数组的顺序相同.

但是,您可以argsort通过指定kind标志来使用稳定排序:

np.argsort(r, kind='stable')
Run Code Online (Sandbox Code Playgroud)

当我在向量上使用稳定排序时:

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)
Run Code Online (Sandbox Code Playgroud)

r结果相比(减去索引差异的一个):

np.array_equal(np.argsort(r, kind='stable'), r_out - 1)
Run Code Online (Sandbox Code Playgroud)

True
Run Code Online (Sandbox Code Playgroud)

一个字的警告:它出现在r切换到Shell排序在一定条件下(我不知道有足够的了解r,以作详细说明),但希尔排序并不稳定.如果满足这些条件,这将是您必须解决的问题.