Глядя на документацию 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
, чтобы дать более подробное разъяснение), но сортировка оболочки не стабильна .Это будет то, что вы должны решить, если эти условия будут выполнены.