Почему argsort(argsort(x)) возвращает ранги элементов массива
Однажды мне понадобилось вычислить ранги элементов массива, или другими словами, на какой позиции окажется каждый элемент после сортировки.
Беглый поиск по интернету дал неожиданно короткий ответ: достаточно применить двойной argsort —argsort(argsort(x)) из библиотеки NumPy. Фокус работает, но почти нигде не объясняется почему именно. Обращаться с таким вопросом к ChatGPT тогда казалось рискованным — в интернете как раз ходили мемы о его ошибках в арифметике. Отсутствие строгого обоснования не давало мне покоя, и в итоге я решил дойти до доказательства самостоятельно.
Ниже я поделюсь этим доказательством. Оно не претендует на уникальность — возможно, существуют более короткие или более элегантные способы прийти к тому же ответу. Тем не менее, оно позволит вам понять, почему двойной argsort действительно возвращает ранги элементов, и избавит вас от необходимости тратить время на самостоятельное разбирательство.
На самом деле в Python в библиотеке scipy уже есть функция rankdata, которая реализует то, что нам нужно. Единственное отличие — rankdata возвращает ранги начиная с 1, тогда как argsort использует нулевую индексацию. Чуть ниже мы сравним их результаты, а пока формализуем нашу задачу.
https://habr.com/ru/articles/1019144/
Алгоритмы и Структуры данных
Post #4474
605
- ❤ 1