[Python.NumPy] Array sort/min/max 함수 (argsort, np.argmax, np.argmin)

2020. 12. 12. 05:00Python과 머신러닝/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에 대한 개념이 헷갈린다면 다음 포스트를 다시 확인하는 것이 좋을 듯하다.

반응형