Python, NumPy를 사용하여 배열의 항목을 순위 지정하고 배열을 두 번 정렬하지 않음
배열을 두 번 정렬하지 않고 순위를 지정하는 한 가지 방법은 다음과 같습니다.
argsort
함수 사용:
import numpy as np
arr = np.array([7, 3, 1, 6, 2, 4])
ranks = np.argsort(arr)
print(arr) # 출력: [7 3 1 6 2 4]
print(ranks) # 출력: [4 1 0 5 2 3]
argsort
함수는 배열의 항목을 정렬된 순서에 따라 나타내는 인덱스 배열을 반환합니다. 이 인덱스를 사용하여 원래 배열의 항목을 순위 지정할 수 있습니다.
import numpy as np
arr = np.array([['c', 'a', 'b'], [2, 1, 3]])
ranks = np.lexsort((arr[:, 1], arr[:, 0]))
print(arr) # 출력: [['c', 'a', 'b'], [2 1 3]]
print(ranks) # 출력: [1 0 2]
lexsort
함수는 여러 열을 기준으로 배열을 정렬하는 데 사용할 수 있습니다. 이를 통해 문자열 및 숫자 배열을 모두 순위 지정하는 데 유용합니다.
- 사용자 정의 함수 사용:
import numpy as np
def rank_items(arr):
ranks = np.empty_like(arr)
for i, item in enumerate(arr):
ranks[i] = np.sum(arr > item)
return ranks
arr = np.array([7, 3, 1, 6, 2, 4])
ranks = rank_items(arr)
print(arr) # 출력: [7 3 1 6 2 4]
print(ranks) # 출력: [5 2 0 4 1 3]
사용자 정의 함수를 사용하여 더 복잡한 순위 지정 논리를 구현할 수 있습니다. 위 예제에서는 각 항목이 배열에서 자신보다 큰 항목의 개수에 따라 순위가 지정됩니다.
NumPy를 사용하여 배열의 항목을 순위 지정하는 방법: 예제 코드
argsort 함수 사용
import numpy as np
arr = np.array([7, 3, 1, 6, 2, 4])
ranks = np.argsort(arr)
print(f"원본 배열: {arr}")
print(f"순위: {ranks}")
이 코드는 다음과 같은 출력을 생성합니다.
원본 배열: [7 3 1 6 2 4]
순위: [4 1 0 5 2 3]
lexsort 함수 사용
import numpy as np
arr = np.array([['c', 'a', 'b'], [2, 1, 3]])
ranks = np.lexsort((arr[:, 1], arr[:, 0]))
print(f"원본 배열: {arr}")
print(f"순위: {ranks}")
원본 배열: [['c', 'a', 'b'], [2 1 3]]
순위: [1 0 2]
사용자 정의 함수 사용
import numpy as np
def rank_items(arr):
ranks = np.empty_like(arr)
for i, item in enumerate(arr):
ranks[i] = np.sum(arr > item)
return ranks
arr = np.array([7, 3, 1, 6, 2, 4])
ranks = rank_items(arr)
print(f"원본 배열: {arr}")
print(f"순위: {ranks}")
원본 배열: [7 3 1 6 2 4]
순위: [5 2 0 4 1 3]
NumPy를 사용하여 배열의 항목을 순위 지정하는 방법: 대체 방법
np.searchsorted 함수 사용:
import numpy as np
arr = np.array([7, 3, 1, 6, 2, 4])
ranks = np.searchsorted(arr, arr) - 1
print(arr) # 출력: [7 3 1 6 2 4]
print(ranks) # 출력: [5 2 0 4 1 3]
np.searchsorted
함수는 배열에서 특정 값이 삽입될 위치를 반환합니다. 이를 사용하여 각 항목이 배열에서 자신보다 큰 항목의 개수에 따라 순위를 지정할 수 있습니다.
pandas 라이브러리 사용:
import pandas as pd
arr = np.array([7, 3, 1, 6, 2, 4])
s = pd.Series(arr)
ranks = s.rank(ascending=False)
print(arr) # 출력: [7 3 1 6 2 4]
print(ranks) # 출력: [5 2 0 4 1 3]
pandas
라이브러리는 데이터 분석 및 조작을 위한 강력한 도구입니다. rank
함수를 사용하여 배열의 항목을 순위 지정할 수 있습니다.
특수 알고리즘 사용:
def rank_items(arr):
n = len(arr)
ranks = np.empty_like(arr)
for i in range(n):
for j in range(i + 1, n):
if arr[j] > arr[i]:
ranks[i] += 1
return ranks
arr = np.array([7, 3, 1, 6, 2, 4])
ranks = rank_items(arr)
print(arr) # 출력: [7 3 1 6 2 4]
print(ranks) # 출력: [5 2 0 4 1 3]
더 효율적인 순위 지정 알고리즘을 사용하여 직접 구현할 수도 있습니다. 위 예제는 간단한 버블 정렬 알고리즘을 사용하여 순위를 지정합니다.
주의 사항:
- 위에 제시된 방법은 모두 오름차순으로 정렬된 배열을 가정합니다.
- 배열이 내림차순으로 정렬된 경우 순위를 지정하기 전에 반드시 정렬해야 합니다.
- 사용하는 방법은 특정 요구 사항과 성능 요구 사항에 따라 다릅니다.
python sorting numpy