[Python.NumPy] Array 비교 연산자와 논리 연산자

2020. 12. 11. 05:00Python과 머신러닝/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로 추출하다 보면 자연스럽게 익힐 수 있을 것이다.
반응형