ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Numpy] Boolean Indexing 알아보기 ( Boolean Mask )
    Python 2024. 3. 9. 21:36
    728x90
    반응형

     

    - 목차

     

    키워드.

    • 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 를 생성할 수 있습니다.

     

    반응형
Designed by Tistory.