NumPy 불린 인덱싱 (Boolean Indexing) 완벽 정리
NumPy에서는 배열을 조건에 따라 효율적으로 필터링할 수 있는 불린 인덱싱(Boolean Indexing) 기능을 제공합니다.
파이썬 기본 리스트에서는 불가능하지만, NumPy 배열에서는 매우 강력하게 활용됩니다.
불린 인덱싱이란?
불린 배열(True/False)을 인덱스로 사용해 원하는 값만 추출하는 방식입니다.
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
mask = arr > 30 # [False False False True True]
filtered = arr[mask]
print(filtered) # [40 50]
arr[조건]이 왜 필터링된 값을 반환할까?
- arr[mask]는 내부적으로 arr.__getitem__(mask)로 동작함
- NumPy는 이 메서드를 오버라이딩하여, mask가 불린 배열이면 True인 값만 반환하도록 처리
즉, NumPy만의 고속 최적화 덕분에 가능한 기능
파이썬 리스트에서는 안됨
lst = [10, 20, 30, 40]
mask = [False, True, False, True]
lst[mask] # ❌ TypeError: list indices must be integers or slices
다양한 예제
arr = np.array([-5, -2, 0, 3, 7])
# 음수만 추출
negative = arr[arr < 0] # [-5 -2]
# 짝수만 추출
even = arr[arr % 2 == 0] # [-2 0]
한눈에 보는 불린 인덱싱 흐름
arr > 30 | 조건에 따라 불린 배열 생성 |
arr[불린배열] | True인 값만 추출 |
결과 | 조건을 만족하는 값만 반환 |
np.where()와의 차이점
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
# 불린 인덱싱
print(arr[arr > 30]) # 👉 [40 50]
# np.where 사용
print(np.where(arr > 30)) # 👉 (array([3, 4]),)
정리 요약
방식 결과 의미
arr[arr > 30] | [40 50] | 조건을 만족하는 값 |
np.where(arr > 30) | (array([3,4]),) | 조건을 만족하는 인덱스 |
✔️ 값이 필요하면 → arr[조건]
🔍 인덱스가 필요하면 → np.where(조건)
마무리 정리
- arr[조건]: 조건에 맞는 값 반환
- np.where(조건): 조건에 맞는 인덱스 반환
- __getitem__() 오버라이딩 덕분에 가능
- Python 리스트에서는 작동하지 않음
- 조건문 + 브로드캐스팅과 함께 쓰면 매우 강력한 데이터 필터링 가능