Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Ну, можно всё упростить. Если p - это перестановка, то r = argsort(p) - это обратная к ней перестановка, то есть p[r] == arange(len(p)). То есть x[p[r]] == x, если длины x и p совпадают. Далее можно заметить, что x[p] - это умножение на перестановочную матрицу P: x[p] == P @ x. То есть x[p[r]] == (R @ P) @ x. Из ассоциативности матричного умножения x == (R @ P) @ x == R @ (P @ x), т.е. x == (x[p])[r]. Т.е. r - это массив индексов элементов исходного массива в отсортированном, ЧТД.
Почему argsort(argsort(x)) возвращает ранги элементов массива