https://stackoverflow.com/questions/28573545/how-to-get-the-index-of-the-sorted-list-for-the-original-list-in-python

argsort 함수는 리스트를 받아서 i번째 위치에 i번째로 작은 값의 인덱스를 넣은 리스트를 리턴하는 함수임. 예를 들어서

1.5 3.1 4.9 6.0 2.1 4.3 0.1 은
6 0 4 1 5 2 3 이 됨.

이 결과에 argsort를 다시 적용하면
1 3 5 6 2 4 0 이 되는데, 신기하게도 이건 원래 리스트의 각 값의 순위 임


누가 이 이유를 카테고리 이론으로 설명을 하는데 하나도 이해 못하겠음 ㅋㅋㅋㅋ
(무슨 xs랑 argsort xs가 dual의 관계라더라..)
그래서 간단하게 설명하는 방법을 생각해봄

먼저 문제를 간단하게 하기 위해서, 리스트에 들어있는건 0..n의 정수라고 하겠음.

인덱스를 받아서 값을 주는 함수를 v, 값을 받아서 인덱스를 주는 함수를 i라고 쓸게.
그러면 당연히 v . i = i . v = id 임.

ys = argsort xs라 할 때
xs 에서 x 보다 뒤에 y가 오는걸 x -> y
ys 에서 x 보다 뒤에 y가 오는걸 x ->' y 라고 쓸게.

그러니까 다음이 자명하게 성립함.
(x -> y) => (i(x) < i(y))

그리고 argsort의 정의에 의해 다음도 성립함
(x < y) => (i(x) ->' i(y))

여기서 위 두 명제를 합성하면
(x -> y) => (i (i x) ->' i (i y))
를 얻을 수 있음

그러니까 argsort 함수는 i.i 를 원래 리스트에 map 한 함수로 생각할 수 있다는거지.

이제 ys에서 argsort 를 다시 적용시켜보자.
ys 에서 인덱스로부터 값을 얻는 함수 v'은
v' = i . i . v = i 임. (값에다가 i.i 를 map했으니까)
그리고 v' . i' = id 를 만족해야 하므로
i' = v 가 됨.

그럼 이제 argsort를 2번 적용하는 연산은
i' . i' . i . i = v v i i
= id 가 된다.

argsort를 2번 적용하면 그냥 원래 리스트가 나오는 거임!

맨 처음에 리스트 원소를 0..n의 정수라고 했으니까 id 함수인거고, 그 가정을 없애면 리스트를 받아서 각 원소의 순위를 리턴하는 함수가 됨. 근데 그 가정을 없애고 깔끔하게 증명하는 법은 잘 모르겠다. 어쨋든 중요한건 argsort를 두번 적용할때 ordering이 보존된다는거임.