[Python.NumPy] Array 비교 연산자와 논리 연산자
2020. 12. 11. 05:00ㆍPython과 머신러닝/NumPy 데이터 분석
0. 요약
- 일반 scalar 값의 대소 비교를 하듯 Array에도 대소 비교가 필요하다.
- NumPy에는 대소비교 뿐만 아니라, 논리 연산 (AND/OR)을 지원하는 함수들을 제공한다.
- np.logical_and, np.logical_or, np.where, np.all, np.any, np.isnan, np.isfinite과 같이 다양한 함수들의 용법과,
각 함수가 반환하는 데이터에 대해서 이해해보자.
1. Array와 Array의 비교
In [1]:import numpy as np
In [2]:test_a = np.array([1,3,0],
float)
test_a
Out[2]:array([1., 3., 0.])
In [3]:test_b = np.array([5,2,1],
float)
test_b
Out[3]:array([5., 2., 1.])
In [4]:test_a > test_b
Out[4]:array([False, True, False])
- 같은 크기의 배열을 비교하면 element-wise operation (요소별 비교)이 일어나서 각각의 대소 비교에 대한 결과를 True/False로 반환하게 된다.
- 두 개의 배열과 같은 크기의 배열에 True/False의 값이 담겨서 반환된다.
2. Array와 Scalar의 비교
In [5]:test_c = np.arange(10)
test_c
Out[5]:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [6]:test_c < 4 # Broadcasting 되어 각 요소가 4보다 작은지 비교한 결과값의 배열을 return
Out[6]:array([ True, True, True, True, False, False, False, False, False, False])
- test_c라는 ndarray와 4라는 scalar 값을 비교하면 scalar를 array로 brodacasting 한 뒤에,
element-wise operation이 일어난다. - 그렇기 때문에 0~3까지는 True가 나오고, 그 외에는 False가 담긴 array가 반환된다.
3. np.logical_and와 np.logical_or
In [7]:test_d = np.array([1,3,0], float)
test_d
Out[7]:array([1., 3., 0.])
In [8]:np.logical_and(test_d > 0, test_d < 3) # 모든 조건을 충족할 경우 True, 아닐 경우 False
Out[8]:array([ True, False, False])
In [9]:np.logical_or(test_d > 2, test_d < 1)
Out[9]:array([False, True, True])
- np.logical_and 함수는 각 element가 모든 조건을 충족할 경우 True, 하나라도 충족하지 못할 경우 False를 반환한다.
- np.logical_or 함수는 반대로 하나라도 충족하면 True, 아닐 경우 False를 반환한다.
4. np.where
In [10]:np.where(test_d > 0) #test_d 배열 중 0보다 큰 값을 가진 요소들의 index번호를 배열로 반환하는 함수
Out[10]:(array([0, 1], dtype=int64),)
In [11]:np.where(test_d > 0,3,2) # (condition, TRUE, FALSE)
Out[11]:array([3, 3, 2])
- np.where 함수는 주어진 조건을 충족시키는 element들의 index를 array 형태로 반환하는 함수이다.
- np.where(test_d>0, 3, 2) 라고 할 경우, test_d 중 0보다 큰 값이 있는 index에는 TRUE의 결과인 3을,
크지 않은 index에는 FALSE의 결과인 2를 담은 배열을 반환한다. - 그래서 Out[11]과 같이 [3, 3, 2]를 반환하게 된다.
5. np.all과 np.any
In [12]:np.all(test_c<5) # test_c<5의 모든 결과값이 True일 때만 True, 아니면 False
Out[12]:False
In [13]:np.all(test_c<10) # test_c<10의 모든 결과값이 True이기 때문에 True
Out[13]:True
In [14]:np.any(test_c>5)
Out[14]:True
In [15]:np.any(test_c<0)
Out[15]:False
- np.all(test_c < 5)라는함수는 test_c < 5의 결과가 전부 True일 때는 True를 반환하고,
하나라도 False이면 False를 반환한다 (전체 배열에 대한 AND 조건이라고 이해해도 무방하다) - np.any(test_c < 5)라는 함수는 test_c < 5의 결과가 전부 False 일 때만 False를 반환하고,
하나라도 True이면 True를 반환한다 (전체 배열에 대한 OR 조건이라고 이해해도 무방하다)
6. np.isnan, np.isfinite
In [16]:test_d = np.array([1,np.NaN, np.Inf], float)
test_d
Out[16]:array([ 1., nan, inf])
In [17]:np.isnan(test_d)
Out[17]:array([False, True, False])
In [18]:np.isfinite(test_d)
Out[18]:array([ True, False, False])
- NaN이란 Not a Number의 줄임말이다. 데이터를 입력하지 않은 경우 NaN으로 표기된다.
- Inf는 Divide By Zero 등을 통해 값이 이상해졌을 경우 np.Inf로 표기된다.
- isnan 함수는 test_d 배열에서 NaN인 위치의 index를 반환하는 함수이다.
- isfinite 함수는 각 위치의 값이 finite 한 값인지 infinite 한 값인지를 알려주는 함수이다.
7. 마무리
- Array 간의 비교, 논리 연산자는 항상 사용되는 함수들이다.
- 다양한 기능들을 제공하는 만큼, 각각의 함수들이 index를 반환하는지 실제 값을 반환하는지, array를 반환하는지 Boolean을 반환하는지 정확하게 이해할 필요가 있다.
- 해당 코드를 직접 작성해보고, 필요한 데이터를 NumPy로 추출하다 보면 자연스럽게 익힐 수 있을 것이다.
'Python과 머신러닝 > NumPy 데이터 분석' 카테고리의 다른 글
[Python.NumPy] Boolean Index와 Fancy Index (0) | 2020.12.13 |
---|---|
[Python.NumPy] Array sort/min/max 함수 (argsort, np.argmax, np.argmin) (0) | 2020.12.12 |
[Python.NumPy] Array 간의 연산과 Broadcasting (0) | 2020.12.10 |
[Python.NumPy] array 붙이기 hstack, vstack, concatenate - Operation Function II (0) | 2020.12.09 |
[Python.NumPy] 차원별 sum 합, std 표준편차 구하기 - Operation Function I (0) | 2020.12.08 |