[Python.NumPy] Boolean Index와 Fancy Index

2020. 12. 13. 05:00Python과 머신러닝/NumPy 데이터 분석

1. Boolean Index

In [1]:import numpy as np
In [2]:test_a = np.array([1,4,0,2,3,8,9,7], float) 
       test_a
Out[2]:array([1., 4., 0., 2., 3., 8., 9., 7.])

In [3]:test_a > 3 # test_a 중에서 각 요소별로 3보다 큰지 작은지에 대한 boolean 값이 담김
Out[3]:array([False, True, False, False, False, True, True, True])

In [4]:test_a[test_a > 3]
Out[4]:array([4., 8., 9., 7.])
  • test_a > 3이라고 하면 각 요소가 3보다 큰지에 대한 Boolean 값을 반환한다고 이미 정리한 바 있다.
  • 이 Boolean 배열을 test_a의 index로 전달하면, test_a 중 True인 index의 값들만 추출해서 보게 된다.
  • 이런 식으로 주어진 배열에서 조건을 충족하는 값들만 추출하는 방법을 Boolean indexing이라고 한다.

 

2. Fancy Index

In [5]:test_b = np.array([2,4,6,8], 
                         float)
In [6]:cond = np.array([1,1,1,2,1,0,1,3]) 
       cond
Out[6]:array([1, 1, 1, 2, 1, 0, 1, 3])

In [7]:test_b[cond] # test_b의 index를 접근할 때, cond 배열의 각각의 값으로 접근
Out[7]:array([4., 4., 4., 6., 4., 2., 4., 8.])

In [8]:test_b.take(cond) # .take함수를 사용해서도 동일하게 fancy indexing을 할 수 있다.
Out[8]:array([4., 4., 4., 6., 4., 2., 4., 8.])

In [9]:cond = np.array([4]) # 기존 test_b 배열의 max_index를 넘어가면 어떻게 될까? 
       test_b[cond]
Out[9]:IndexError: index 4 is out of bounds for axis 0 with size 4
  •  그렇다면 Fancy indexing이란 무엇일까?
  • 우리가 일반적으로 test_b의 첫번째 값을 읽고 싶으면 test_b[0]라고 접근할 것이다.
  • 이러한 접근을 여러 개 한번에 하고 싶다면, index를 숫자 하나가 아니라 하나의 배열에 여러 숫자를 담아서 전달할 수 있다.
  • [7]에서 test_b를 접근하는 index를 cond라는 배열에 담아서 전달하니, test_b로 부터 각각의 index에 위치한 값들을 읽어낸다.
  • [9]와 같이 index 값이 너무 크다면? 당연히 index out of bounds error가 발생한다.

 

3. 2차원 이상 배열에서 Fancy indexing

In [10]:test_c = np.array([[1,4], [9,16]], float) 
        test_c
Out[10]:array([[ 1., 4.], [ 9., 16.]])

In [11]:cond_row = np.array([0,0,1,1,0]) 
        cond_col = np.array([0,1,1,0,1])
In [12]:test_c[cond_row, cond_col] # cond_row의 값과 cond_col의 값을 각각 추출해서 순서대로 test_c로부터 추출함
Out[12]:array([ 1., 4., 16., 9., 4.])
  • [12]의 command는 cond_row의 값과 cond_col의 값을 각각 추출해서 순서대로 test_c로부터 추출하라는 명령어이다.
  • 결과는 test_c[0,0], test_c[0,1], test_c[1,1], test_c[1,0], test_c[0,1] 순서로 나오게 된다.
  • 조건은 cond_row와 cond_col의 shape가 동일해야 한다는 것이다.
반응형