조금씩 꾸준히 완성을 향해

[Numpy] 비교 연산(Comparison Operators) 본문

Python/Numpy & Pandas

[Numpy] 비교 연산(Comparison Operators)

all_sound 2022. 9. 25. 09:17

비교 연산

  • 연산결과는 항상 boolean type을 가진 배열로 추출

 

1-1 브로드캐스팅 비교연산

  • 하나의 스칼라 값과 벡터 간의 비교 연산은 벡터 내 전체 요소에 적용
x = np.array([4,3,2,6,8,5])
x > 3
# array([ True, False, False,  True,  True,  True])
x == 3
#array([False,  True, False, False, False, False])
x != 3
#array([ True, False,  True,  True,  True,  True])

 

1-2 요소별 비교연산

  • 두 개의 배열 간 배열의 shape이 동일한 경우만 가능
  • 같은 위치에 있는 요소들끼리 비교 연산
  • [1>2, 3>1, 0>7]과 같이 연산이 실시된 후 이를 반환
x = np.array([1,3,0])
y = np.array([2,1,7])
x > y
#array([False,  True, False])
# 두 배열의 shape이 다르기 때문에 error
y1 = np.array([2,1,7,9])
x > y1

 

2-1 ALL & ANY

  • all 함수 : 배열 내부의 모든 값이 침을 때는 True, 하나라도 참이 아닐 경우에는 False 반환. (and 조건)
  • any 함수 : 배열 내부의 값 중 하나라도 참을 때는 True, 모두 참이 아닐 경우에는 False 반환 (or 조건)
x= np.array([4,6,7,3,2])
x > 3
#array([ True,  True,  True, False, False])
print((x > 3).all())  #False
print((x > 3).any())  #True
print((x < 10).any())  #True
print((x < 10).all())  #True
print((x > 10).all())  #False

 

2-2 Index 반환 함수

  • where 함수 : 배열이 boolean형으로 이루어졌을 때 참인 값들의 index를 반환
    • => True/False 대신 True/False인 경우의 값을 지정할 수 있음
# np.where(condition) -> condition이 True인 index 값 반환
x = np.array([4,6,7,3,2])
np.where(x > 5)  
#(array([1, 2]),)
# np.where(condition, [x, y]) -> condition이 True면 x, False면 y 반환
np.where(x >5, 0, 1) 
#array([1, 0, 0, 1, 1])

 

2-3 정렬된 값의 Index를 반환해 주는 함수

  • argsort: 배열 내 값들을 작은 순서대로 인덱스 반환
  • argmax : 배열 내 값들 중 가장 큰 값의 인덱스 반환
  • argmin : 배열 내 값들 중 가장 작은 값의 인덱스 반환
x = np.array([4,6,7,3,2]) 
print(np.argsort(x)) #[4 3 0 1 2]
print(np.argmax(x))  #2
print(np.argmin(x))  #4

 

3-1 Boolean Index

  • 배열에 있는 값들을 반환할 특정 조건을 boolean형의 배열에 넣어서 추출
    • 인덱스에 들어가는 배열은 boolean형이어야 함
    • boolean형 배열과 추출 대상이 되는 배열의 구조가 같아야 함
x = np.array([4,6,7,3,2])
print(x > 3)  #[ True  True  True False False]
cond = x > 3
x[cond]  #array([4, 6, 7])
print(x.shape)  #(5,)
print(cond.shape)  #(5,)

 

3-2 Fancy Index

  • 정수형 배열의 값을 사용하여 해당 정수의 인덱스에 위치한 값을 반환
    • 인덱스 항목에 넣을 배열은 정수로만 구성되어야 함
    • 정수 값의 범위는 대상이 되는 배열이 가지는 인덱스의 번위 내 대상이 되는 배열과 인덱스 배열의 shape이 같을 필요는 없음
x =  np.array([4,6,7,3,2])
cond = np.array([1,2,0,2,2,2], int)
x[cond]  #array([6, 7, 4, 7, 7, 7])
x =  np.array([4,6,7,3,2])
cond = np.array([1,2,0,2,4,5], int)  
x[cond]
# IndexError: index 5 is out of bounds for axis 0 with size 5
# cond의 요소 값이 x의 Index 범위를 넘어서기 때문에 Error

x.take(cond)  # take함수로도 사용 가능
#array([6, 7, 4, 7, 7, 7])
x = np.array([[1,4], [9, 16]], int)
a = np.array([0, 1, 1, 1, 0, 0], int)
b = np.array([0, 0, 0, 1, 1, 1], int)
x[a, b]
#array([ 1,  9,  9, 16,  4,  4])