[Python.NumPy] Array sort/min/max 함수 (argsort, np.argmax, np.argmin)
2020. 12. 12. 05:00ㆍPython과 머신러닝/NumPy 데이터 분석
0. 요약
- 배열의 값들을 오름차순/내림차순으로 정렬하는 방법을 알아보자.
- 그리고 배열의 최대 최소 값을 어떻게 추출할지, 또 row/col 별 최대 최소값은 어떻게 추출할 수 있는지 알아보자.
1. argsort
In [1]:import numpy as np
In [2]:a = np.array([4,2,1,7])
a
Out[2]:array([4, 2, 1, 7])
In [3]:sort_index = a.argsort() # 오름차순 기준 index 순서를 반환 sort_index
Out[3]:array([2, 1, 0, 3], dtype=int64)
In [4]:a[sort_index] #fancy indexing으로 순서대로 추출
Out[4]:array([1, 2, 4, 7])
In [5]:sort_index[::-1] # 기존의 순서를 거꾸로 추출한 결과 --> 내림차순
Out[5]:array([3, 0, 1, 2], dtype=int64)
In [6]:a[sort_index[::-1]] # a 배열로부터 내림차순 index로 fancy indexing
Out[6]:array([7, 4, 2, 1])
- a.argsort()는 a라는 ndarray를 오름차순 정렬하기 위한 index의 순서를 배열로 반환한다.
- 즉, Out[3]의 [2,1,0,3]은 오름차순 정렬하기 위해 a[2], a[1], a[0], a[3] 순서로 추출해야 된다는 것이다.
- 위의 결과대로 추출할 경우 1,2,4,7이 순서대로 반환될 것이다.
- 이를 확인하기 위해서 a[sort_index]로 fancy indexing을 하면 기대한 값이 나오는 것을 확인할 수 있다 (Out[4])
- 내림차순으로 정렬하기 위해선, 위에서 추출한 sort_index를 뒤집어주면 된다.
- 이 동작은 sort_index[::-1]을 하여 거꾸로 뽑을 수 있고, 뒤집힌 index를 가지고 fancy indexing을 수행하면 간단하게 내림차순 정렬이 가능하다.
- 그 결과는 Out[6]에서 확인할 수 있다.
2. np.argmax
In [7]:a = np.array([[4,2,4,7],
[9,88,6,45],
[9,76,3,0]])
a
Out[7]:array([[ 4, 2, 4, 7], [ 9, 88, 6, 45], [ 9, 76, 3, 0]])
In [8]:np.argmax(a) # 전체 배열 a 중의 max 값의 index
Out[8]:5
- np.argmax(a)를 수행하면, 전체 a라는 배열 중 최대값이 있는 위치의 index를 알려준다.
- 5라는 값은 1번 row의 1번 Col을 의미하기 때문에, 88이 max값이라는 것을 의미하고, 눈으로 확인해도 동일한 내용을 파악할 수 있을 것이다.
3. np.argmin
In [9]:np.argmin(a)
Out[9]:11
- 그렇다면 np.argmin을 수행하면 뭐가 나올까?
- 0이라는 값을 가리키는 index 11이 나오게 된다.
- 다른 말로, 2번 row에 3번 col에 위치한 0을 찾기 위해 11이라는 값을 반환한 것이다.
4. axis별 min/max 값 추출하기
In [10]:np.argmax(a, axis=1)
Out[10]:array([3, 1, 1], dtype=int64)
In [11]:np.argmin(a, axis=0)
Out[11]:array([0, 0, 2, 2], dtype=int64)
- 하지만 대부분의 데이터에서는 전체 테이블의 최소/최대값을 찾는 것은 무의미하다.
- 각 Col별 혹은 row별 최소/최대값을 찾기 위해서는 axis parameter를 추가해줘야 한다.
- 여기서도 마찬가지로 각 row/col의 최소/최대값을 가진 요소의 index를 알려준다는 것을 이해해야 한다.
- Out[10]의 [3, 1, 1]은 각 row의 7, 88, 76이 최대값이라는 것을 의미한다.
- Out[11]의 [0, 0, 2, 2]는 각 col의 4, 2, 3, 0이 최소값이라는 것을 의미한다.
5. 마무리
- argsort, argmin, argmax 함수의 동작을 이해하는 포스트를 정리한다.
- 위 함수들은 직접 sorting을 해서 반환하는 것이 아니라, sorting 할 경우의 index를 순서대로 반환하는 함수이다.
- sorting/min/max 등의 index를 주기 때문에, 이 index를 가지고 Fancy indexing 하여 각각의 값을 확인할 수 있다.
- Fancy indexing에 대한 개념이 헷갈린다면 다음 포스트를 다시 확인하는 것이 좋을 듯하다.
'Python과 머신러닝 > NumPy 데이터 분석' 카테고리의 다른 글
[Python.NumPy] 텍스트 데이터를 읽기 저장하기 - np.loadtxt/np.savetxt/np.load/np.save (0) | 2020.12.14 |
---|---|
[Python.NumPy] Boolean Index와 Fancy Index (0) | 2020.12.13 |
[Python.NumPy] Array 비교 연산자와 논리 연산자 (1) | 2020.12.11 |
[Python.NumPy] Array 간의 연산과 Broadcasting (0) | 2020.12.10 |
[Python.NumPy] array 붙이기 hstack, vstack, concatenate - Operation Function II (0) | 2020.12.09 |