Numpy 배열의 데이터 비교 방법(any, all, where, isnan, argmax, argmin)

파이썬/Numpy|2019.08.08 13:20

np.any(조건) - 배열의 데이터 중 조건과 맞는 데이터가 있으면 True 전혀 없으면 False

 

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.any(arr > 5)
True

np.any(arr < 0)
False

np.all(조건) - 배열의 모든 데이터가 조건과 맞으면 True 하나라도 다르면 False

np.all(arr > 5)
False

np.all(arr < 10)
True

배열의 같은 위치에 있는 요소간의 비교

배열의 shape이 같아야 함

비교연산자 ==, <, > 로 배열 요소 비교

arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2 = np.array([[1, 2, 3], [1, 5, 7], [6, 8, 9]])
arr1 == arr2
array([[ True,  True,  True],
       [False,  True, False],
       [False,  True,  True]])
arr1 > arr2
array([[False, False, False],
       [ True, False, False],
       [ True, False, False]])

np.any(조건)을 쓰지 않고 배열의 함수로 any()를 쓰게 되면

배열의 데이터 중 True나 0이 아닌 숫자가 있으면 True, 하나라도 없으면 False 반환

(arr1 > arr2).any()
True

np.all(조건)을 쓰지 않고 배열의 함수로 all()를 쓰게 되면

배열의 모든 데이터가 0이 아닌 숫자 이거나 True일 때 True를 반환. 하나라도 0 이나 False이면 False 반환


(arr1 > arr2).all()
False

shape이 다른 배열끼리 비교하면 value error 발생

arr1 = np.array([1, 2, 3, 4, 5, 6])
arr2 = np.array([[1, 2, 3], [1, 5, 7]])
arr1 > arr2
ValueError: operands could not be broadcast together with shapes (6,) (2,3) 

 

np.where()

np.where(조건, True 일 때 출력값, False 일 때 출력값)

arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])
np.where(arr > 4, arr, 0)
array([[0, 0, 0],
       [0, 5, 6],
       [7, 8, 9]])

요소가 4보다 크면 arr(그대로). 4보다 작으면 0으로 변환하여 반환


np.where(arr > 4, 0, arr+1)
array([[2, 3, 4],
       [5, 0, 0],
       [0, 0, 0]])

요소가 4보다 크면 0으로 4보다 작으면 원래 요소에 +1 하여 반환

 

np.where(조건) 조건만 쓰면 조건에 맞는 데이터의 인덱스를 반환

np.where(arr > 4)
(array([1, 1, 2, 2, 2], dtype=int64), 
array([1, 2, 0, 1, 2], dtype=int64))

반환되는 튜플에서 첫번째 요소인 [1, 1, 2, 2, 2]는 행

반환되는 튜플에서 두번째 요소인 [1, 2, 0, 1, 2]는 열

즉 (1,1), (1,2), (2,0), (2,1), (2,2) 인덱스의 요소가 4보다 큰 데이터임을 나타냄


arr = np.array([1, 2, 3, 4, 5])
np.where(arr1 > 2)
(array([2, 3, 4], dtype=int64),)

1차원 배열에서는 2번째, 3번째, 4번째 값이 조건에 만족하는 데이터의 인덱스임

 

np.isnan(arr) - 배열의 데이터 중 NaN 값인 요소는 True 아니면 False로 변환

NaN은 Not a Number를 의미

arr = np.array([[1, np.NaN, 3],
                 [np.NaN, 5, 6]])
np.isnan(arr)
array([[False,  True, False],
       [ True, False, False]])

np.isfinite(arr) - 배열의 데이터 중 셀수 있는 데이터를 True 아니면 False로 변환

arr = np.array([[1, np.inf, 3],
               [np.NaN, 5, 6]])
np.isfinite(arr)
array([[ True, False,  True],
       [False,  True,  True]])

np.inf, np.NaN, np.NINF 등을 False로 변환한다.

 

np.argmax(arr) - 배열의 데이터 중 최대값의 인덱스를 반환

np.argmin(arr) - 배열의 데이터 중 최소값의 인덱스를 반환

arr = np.array([[10, 2, 3],
                [4, 50, 6]])
np.argmax(arr)
4

1차원 배열로 생각한 인덱스를 반환


np.argmax(arr, axis=1)
array([0, 1], dtype=int64)

axis=1 일 때 행마다 최대값인 인덱스를 반환

10, 2, 3 중 최대값은 10이기 때문에 10의 인덱스 0 반환

4, 50, 6 중 최대값은 50이기 때문에 50의 인덱스 1 반환


np.argmax(arr,axis=0)
array([0, 1, 1], dtype=int64)

axis=0 일 때 열마다 최대값인 인덱스를 반환

10, 4 중 최대값은 10이기 때문에 10의 인덱스 0 반환

2, 50 중 최대값은 50이기 때문에 50의 인덱스 1 반환

3, 6 중 최대값은 6이기 때문에 50의 인덱스 1 반환

 

argmin()은 최소값을 구하는 함수로 argmax()와 동일한 방법으로 사용됨

댓글()