-
[Numpy] Boolean Indexing 알아보기 ( Boolean Mask )Python 2024. 3. 9. 21:36728x90반응형
- 목차
키워드.
- Boolean Indexing.
- Element-wise Calculation.
들어가며.
Numpy 의 ndarray 는 Boolean Indexing 이라는 기능이 제공됩니다.
만약 a = np.array([1,2,3,4,5]) 라는 ndarray 객체가 존재한다고 가정하겠습니다.
a 는 1, 2, 3, 4, 5 인 5개의 데이터를 가지는 1차원 배열인데요.
아래와 같이 bool_index 를 생성한 이후에 a[bool_index] 와 같은 형식으로 사용하게 되면,
True 와 같은 Index 의 ndarray 의 값이 추출됩니다.
a = np.array([1,2,3,4,5]) bool_index = [True, True, False, False, False] print(f"a : {a[bool_index]} ") print(f"a shape : {a[bool_index].shape} ")
a : [1 2] a shape : (2,)
이러한 방식을 Boolean Indexing 이라고 부르구요.
True 와 False 로 구성된 bool_index 배열을 Boolean Mask 라고 부릅니다.
Boolean Value 를 활용해서 ndarray 를 효과적으로 Selection 할 수 있습니다.
고차원의 ndarray 에도 Boolean Indexing 이 적용가능합니다.
아래 예시는 (2,5) shape 인 ndarray 에 Boolean Indexing 을 적용하는 코드입니다.
a = np.array([[1,2,3,4,5], [6,7,8,9,10]]) b = a[[[True, True, False, False, False], [True, True, False, False, False]]] print(a) print(b)
아래 결과를 보시면 "1, 2, 6, 7" 이 출력됩니다.
그 이유는 Boolean Mask 의 첫번째와 두번째 Row 의 0, 1번 Column 의 값이 True 이기 때문입니다.
[[ 1 2 3 4 5] [ 6 7 8 9 10]] [1 2 6 7]
하지만 의아한 것은 출력된 결과의 shape 이 1차원 배열이라는 점입니다.
이것이 Boolean Indexing 의 특징 중의 하나인데요.
Boolean Indexing 이 적용된 결과는 항상 Flatten 되어 나타납니다.
그 이유는 Boolean Indexing 의 결과가 항상 N x M 의 Shape 를 유지한다는 보장이 없기 때문입니다.
Boolean Index 의 결과가 다차원 배열이 직사각형 모양의 Shape 을 가지도록 보장하기 않기 때문에 안전한 방식인 1차원 배열로 결과를 리턴하게 됩니다.
Boolean Mask.
Boolean Mask 는 True, False 로 구성된 N 차원 배열입니다.
Boolean Mask 는 원본 ndarray 와 동일한 Shape 로 구성되어야합니다.
원본 ndarray 가 (2,3) 의 shape 를 가진다면 , Boolean Mask 역시 (2,3) 의 shape 를 가지는 Boolean Value 들로 구성되어야합니다.
아래와 같이 1 ~ 9 의 숫자들로 구성된 (3,3) shape 의 nparray 는 (3,3) 인 Boolean Mask 를 가져야합니다.
import numpy as np num_array = np.array([[1,2,3], [4,5,6], [7,8,9]])
위 케이스에서 짝수 또는 홀수를 위한 Boolean Mask 는 아래와 같이 구성되어야합니다.
bool_mask_even_num = [[False, True, False], [True, False, True], [False, True, False]] bool_mask_odd_num = [[True, False, True], [False, True, False], [True, False, True]]
Element-wise Calculation.
Numpy 는 Element-wise Calculation 이 지원됩니다.
다차원 배열에 사칙연산과 같인 연산이 적용될 때에, 배열의 각 요소에 개별적으로 연산이 적용됨을 뜻합니다.
예를 들어, Int 1 로 구성된 길이 5인 배열 a 가 존재하고 여기에 1을 더하거나 빼는 연산을 수행합니다.
그 결과로써 배열의 모든 요소에 덧셈과 뺄셈이 적용되는 것을 확인할 수 있습니다.
import numpy as np a = np.array([1,1,1,1,1]) print(a) a += 1 print(a) a -= 1 print(a)
array([1, 1, 1, 1, 1]) array([2, 2, 2, 2, 2]) array([1, 1, 1, 1, 1])
이렇게 ndarray 에 적용되는 연산과 피연산자는 배열의 각 요소에 개별적으로 적용됩니다.
더 나아가서 True 또는 False 를 반환하는 조건식을 Element-wise 하게 적용할 수도 있습니다.
a = np.array([1,1,1,1,1]) even_num_mask = a % 2 == 0 print(even_num_mask) odd_num_mask = a % 2 == 1 print(odd_num_mask)
[False False False False False] [ True True True True True]
위 결과는 False 또는 True 로 구성된 배열을 생성하고, 이러한 Element-wise Calcuation 의 도움으로 손쉽게 Boolean Mask 를 생성할 수 있습니다.
반응형'Python' 카테고리의 다른 글
[Numpy] copy & view 알아보기 (Shallow, Deep Copy) (0) 2024.03.18 [Pandas] DataFrame concat 알아보기 (0) 2024.03.09 [Python] threading Condition 알아보기 ( wait, notify ) (0) 2024.03.09 [Python] io.BytesIO truncate 알아보기 (0) 2024.02.22 [Pandas] Series CRUD 알아보기 (0) 2024.02.21