📊데이터 분석/KAIST ICT Academy

[Numpy] Boolean Masking

루오 2024. 11. 9. 20:33

Boolean Masking: 조건에 따라 배열의 요소를 선택할 수 있는 Numpy의 기능

데이터 분석과 처리에서 자주 사용되며, 특정 조건을 만족하는 요소들을 쉽게 필터링할 수 있다.

 

Boolean mask: True와 False로 이루어진 배열

mask 배열을 원본 배열에 적용하면 True에 해당하는 요소들만 선택되어 필터링 된다.

element-wise로 대응해 처리하기 때문에 원본 배열과 masking배열의 shape은 같아야한다.

import numpy as np

arr = np.array([10, 15, 20, 25, 30])
mask = arr > 20  # masking배열 생성
newArr = arr[mask]  # 원본 배열에 masking배열 적용
print(newArr)

## 출력
[25,30]

 

다음과 같이 masking배열을 활용해서 원본 배열의 값을 변경할 수도 있다.

import numpy as np

arr = np.array([10, 15, 20, 25, 30])
arr[arr > 20] = 0  # 20보다 큰 원소들을 모두 0으로 변경
print(arr)

## 출력
[10, 15, 20, 0, 0]

 

여러 조건을 결합해서 masking배열을 만들 때는 &(and), |(or), ~(not) 연산자를 사용한다.

arr = np.array([10,20,25,40,50])
mask = (arr < 20) | (arr > 25)
print(arr[mask])

 

조건을 만족하는 값 대신 인덱스를 얻고 싶다면 np.where을 사용하면 된다.(반환 튜플)

arr = np.array([10,20,30,40,50])
indices = np.where(arr > 20)
print(indices)

## 출력
(array([2, 3, 4]),)

예시로 대각선의 원소들만을 masking을 이용해 추출해보자

# 원본 배열의 크기가 5*5라면
diagonal_mask = (np.eye(5) == 1)

arr = np.arange(1,26).reshape(5,5)
arr[~diagonal_mask] = 0  ## 대각원소만 추출

## 출력
[[ 1  0  0  0  0]
 [ 0  7  0  0  0]
 [ 0  0 13  0  0]
 [ 0  0  0 19  0]
 [ 0  0  0  0 25]]

eye메소드를 이용해 단위행렬을 생성하고 원소의 값이 1인 부분만 추출하여 masking배열을 생성할 수 있다.

위와 같이 대각선의 원소들만 추출할 수도 있다.