Сортировка по R и Numpy - PullRequest
       2

Сортировка по R и Numpy

0 голосов
/ 12 декабря 2018

Я пытаюсь преобразовать код 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)

в numpy с помощью следующего кода

index = np.argsort(r)

ВотРезультаты

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])

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]

Как видите, результаты разные.Как я могу получить результаты R в NumPy

1 Ответ

0 голосов
/ 12 декабря 2018

Глядя на документацию order, похоже, что r использует радикальную сортировку для коротких векторов, которая действительно является стабильной сортировкой.argsort, с другой стороны, по умолчанию использует быструю сортировку, которая является , а не стабильной сортировкой, и не гарантирует, что связи будут в том же порядке, что и исходный массив.

Однако вы можете использовать стабильную сортировку с argsort, указав флаг kind:

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 (вычитая единицу для разницы в индексировании):

np.array_equal(np.argsort(r, kind='stable'), r_out - 1)

True

Слово предупреждения : оноПоявляется r переключается на сортировку оболочки при определенных условиях (я не знаю достаточно о r, чтобы дать более подробное разъяснение), но сортировка оболочки не стабильна .Это будет то, что вы должны решить, если эти условия будут выполнены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...