본문 바로가기

머신러닝 공부

numpy ndarray의 sort & argsort

SMALL

배열의 정렬

넘파이 sort() 유형

우선 sort는 이름에서 유추할 수 있듯이 넘파이 ndarray의 값을 정렬하는 방식입니다. 이 방식은 2개로 나눌 수 있습니다.

  • np.sort(ndarray) : 인자로 들어온 원 행렬은 그대로 유지한 채 원 행렬의 정렬된 행렬을 반환
  • ndarray.sort() : 원 행렬 자체를 정렬한 형태로 변환하면서 반환 값은 None

※ np.sort() , ndarray.sort() 모두 기본적으로 오름차순으로 행렬 내 원소를 정렬합니다. 

만약, 내림차순으로 정렬하기 위해선 [::-1]을 적용시킵니다. ex) np.sort()[::-1]

 

 

2차원 배열에서 axis 기반의 sort()

다음그림을 보자면 A라는 2차원 배열을 가지는 ndarray가 있는데 이를 axis를 기준으로 sort를 시키는 것입니다.

np.sort(A,axis0) 이라면 axis0은 2차원 배열에서 Row를 의미하므로 Row 방향대로는 오름차순으로 정렬을 하란 것을 의미합니다.

 

 

argsort()

arg는 argument를 줄임말입니다. 

원본 행렬 정렬 시 정렬된 행렬의 원래 인덱스를 필요로 할 때 np.argsort()를 이용합니다. np.argsort()는 정렬 행렬의 원본 행렬 인덱스를 ndarray 형으로 반환합니다.

위의 내용을 가지고 실습을 해보겠습니다.

org_array = np.array([ 3, 1, 9, 5]) 
print('원본 배열:', org_array)
# np.sort( )로 정렬 
sort_array1 = np.sort(org_array)         
print ('np.sort( ) 호출 후 반환된 정렬 배열:', sort_array1) 
print('np.sort( ) 호출 후 원본 배열:', org_array)
# ndarray.sort( )로 정렬
sort_array2 = org_array.sort()
print('org_array.sort( ) 호출 후 반환된 배열:', sort_array2)
print('org_array.sort( ) 호출 후 원본 배열:', org_array)

 

원본 배열: [3 1 9 5]
np.sort( ) 호출 후 반환된 정렬 배열: [1 3 5 9]
np.sort( ) 호출 후 원본 배열: [3 1 9 5]
org_array.sort( ) 호출 후 반환된 배열: None
org_array.sort( ) 호출 후 원본 배열: [1 3 5 9]

다음 코드들을 보아서 np.sort()와 org_array.sort()의 차이점을 보여주는 실습을 진행하였습니다.

앞선 설명대로 원 배열을 지키면서 정렬된 배열을 새로 만드는 np.sort()와 원 배열을 변환하고 return 값을 None으로 하는 org_array.sort()를 볼 수 있습니다.

 

array2d = np.array([[8, 12], 
                   [7, 1 ]])

sort_array2d_axis0 = np.sort(array2d, axis=0)
print('로우 방향으로 정렬:\n', sort_array2d_axis0)

sort_array2d_axis1 = np.sort(array2d, axis=1)
print('컬럼 방향으로 정렬:\n', sort_array2d_axis1)

 

로우 방향으로 정렬:
 [[ 7  1]
 [ 8 12]]
컬럼 방향으로 정렬:
 [[ 8 12]
 [ 1  7]]

다음은 2차원 ndarray를 만들고 이를 axis를 다르게 하여 sort를 하는 결과를 확인하였습니다.

axis0 (열) 방향으로 정렬을 하고 싶으면 np.sort(array2d, axis0) 과 같은 방법으로 정렬할 수 있습니다.

앞으로 numpy에 있는 함수들은 axis (차원 축)별로 연산하는 기능이 많고 이를 많이 활용할 것입니다.

 

 

import numpy as np

name_array = np.array(['John', 'Mike', 'Sarah', 'Kate', 'Samuel'])
score_array= np.array([78, 95, 84, 98, 88])

sort_indices_asc = np.argsort(score_array)
print('성적 오름차순 정렬 시 score_array의 인덱스:', sort_indices_asc)
print('성적 오름차순으로 name_array의 이름 출력:', name_array[sort_indices_asc])

다음 코드들을 보면 name_array, score_array 각각 값을 매핑을 시켰습니다.

예를 들어 John : 78 , Mike : 95 .... 등과 같이 매핑을 시켰습니다.

이후 성적 순 (score_array) 을 기준으로 sort를 하고 이에 따른 인덱스 출력은 다음과 같이 나타낼 수 있습니다.

=> 우리가 알고 싶은 것은 사람의 이름이고, score 순으로 정렬을 하면 좋습니다.

따라서 argsort를 이용해서 정렬한 인덱스를 반환하고 이를 팬시 인덱싱을 해서 출력해줍니다.

성적 오름차순 정렬 시 score_array의 인덱스: [0 2 4 1 3]
성적 오름차순으로 name_array의 이름 출력: ['John' 'Sarah' 'Samuel' 'Mike' 'Kate']

 

LIST

'머신러닝 공부' 카테고리의 다른 글

판다스(pandas) - 기본 API (2)  (0) 2023.02.03
판다스(Pandas)와 기본 API (1)  (0) 2023.02.03
numpy(3)  (0) 2023.02.01
numpy(2)  (0) 2023.02.01
NumPy (넘파이)  (0) 2023.02.01