[Python.NumPy] Boolean Index와 Fancy Index
2020. 12. 13. 05:00ㆍPython과 머신러닝/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가 동일해야 한다는 것이다.
'Python과 머신러닝 > NumPy 데이터 분석' 카테고리의 다른 글
[Python.NumPy] 텍스트 데이터를 읽기 저장하기 - np.loadtxt/np.savetxt/np.load/np.save (0) | 2020.12.14 |
---|---|
[Python.NumPy] Array sort/min/max 함수 (argsort, np.argmax, np.argmin) (0) | 2020.12.12 |
[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 |