홈으로 돌아가기

NumPy 배열의 순위에 대한 이중 argsort

기사는 NumPy 배열 요소의 순위를 얻기 위한 이중 argsort 메커니즘을 설명합니다. 엄격한 수학적 증명, 코드 예제, rankdata와의 비교를 제공합니다. ML 및 데이터 처리에서 순위 작업 최적화에 적합합니다.

NumPy에서 argsort(argsort(x)) = 배열 순위인 이유
Advertisement 728x90

NumPy에서 배열 순위 매기기를 위한 이중 argsort의 수학적 원리

np.argsort(np.argsort(x))를 두 번 적용하면 특수 함수 없이 배열 요소의 순위를 얻을 수 있습니다. 이 방법은 고유한 값을 가진 배열에서 작동하며, 중복 값이 있을 경우 원래 위치를 고려합니다. 1부터 시작하는 scipy.stats.rankdata와 달리, 이중 argsort는 0부터 시작하는 인덱싱을 사용하며 method='ordinal' 접근법과 동일합니다.

배열 a = [13, 0, 47, 52, 27]을 생각해 보세요. 정렬된 버전은 s = [0, 13, 27, 47, 52]입니다. 첫 번째 argsort는 인덱스 [1, 0, 4, 2, 3]를 제공하고, 두 번째는 순위 [1, 0, 3, 4, 2]를 제공하며, 이는 rankdata(a, method='ordinal') - 1과 일치합니다.

import numpy as np
from scipy.stats import rankdata

a = np.array([13, 0, 47, 52, 27])
print("a:", a)
s = np.sort(a)
print("s = sort(a):", s)
m = np.argsort(a)
print("m = argsort(a):", m)
p = np.argsort(m)
print("p = argsort(argsort(a)):", p)
r = rankdata(a, method="ordinal") - 1
print("r = rank(a):", r)

출력:

Google AdInline article slot
a: [13 0 47 52 27]
s = sort(a): [0 13 27 47 52]
m = argsort(a): [1 0 4 2 3]
p = argsort(argsort(a)): [1 0 3 4 2]
r = rank(a): [1 0 3 4 2]

문제 공식화

정의:

  • a = (a_1, ..., a_N) — 원본 배열.
  • s = (s_1, ..., s_N) — 오름차순으로 정렬된 배열.
  • m = argsort(a)a_{m_i} = s_i를 만족하는 인덱스.
  • p = argsort(m) — 이중 argsort.
  • r = (r_1, ..., r_N)s_{r_i} = a_i를 만족하는 순위.

목표: 모든 i에 대해 p_i = r_i임을 증명하라.

중복 값이 있을 경우, 이중 argsort는 더 작은 원본 인덱스를 가진 요소에 더 낮은 순위를 할당하여 고유한 순위를 보장합니다.

Google AdInline article slot

단계별 증명

  • 배열 m{1, ..., N}의 순열이며, 모든 m_i는 고유합니다: i ≠ k일 때 m_i ≠ m_k.
  • p = argsort(m)m을 오름차순으로 정렬합니다: m_{p_1} < m_{p_2} < ... < m_{p_N}, 동등성은 불가능합니다. 따라서 모든 i에 대해 m_{p_i} = i입니다.
  • argsort 속성에서: a_{m_i} = s_i. i = p_k를 대입: a_{m_{p_k}} = s_{p_k}.
  • 2단계에서 m_{p_k} = k이므로 a_k = s_{p_k}.
  • 이는 p_k가 정렬된 배열 s에서 a_k의 위치, 즉 순위임을 의미합니다: p_i = r_i.

이 증명은 NumPy의 안정적인 정렬을 사용하는 모든 차원의 배열에 대해 정확성을 확인합니다.

실용적 적용 측면

  • 안정성: NumPy argsort는 안정적이므로 동일한 요소는 인덱스 순서를 유지합니다.
  • 성능: 이중 argsort는 큰 배열에서 방법 커스터마이즈 없이 rankdata보다 빠릅니다.
  • 제한사항: 실수 또는 정수 배열에서만 작동합니다; 문자열 배열의 경우 사전식 순서를 사용하세요.

사용 시나리오 목록:

  • 데이터 과학 파이프라인에서 백분위수 계산.
  • 정규화 전 ML 모델의 특징 순위 매기기.
  • 예측 순위를 기반으로 혼동 행렬 구축.
  • 시간 시리즈 분석에서 국소 극값 식별.

핵심 요약

  • 이중 argsort(argsort(x))는 ordinal 방법을 사용한 0 기반 순위와 동일합니다.
  • 증명은 순열 속성과 argsort 구성에 의존합니다.
  • 중복 값이 있을 경우 순위는 고유하며 원래 순서에 따라 달라집니다.
  • 추가 매개변수 없이 간단한 경우 rankdata보다 더 효율적입니다.
  • 데이터 처리 작업에서 중간 이상 수준의 개발자에게 적합합니다.

— Editorial Team

Google AdInline article slot
Advertisement 728x90

다음 읽기