[Numpy] 브로드캐스팅, boolean indexing

Surf in Data·2022년 4월 3일
0

numpy

목록 보기
6/6
post-thumbnail

브로드캐스팅

  • Shape이 같은 두 ndarray에 대한 연산은 각 원소별로 진행
  • 연산되는 두 ndarray가 다른 Shape을 갖는 경우 브로드 캐스팅(Shape을 맞춤) 후 진행

브로드캐스팅 Rule

  • 공식문서
  • 뒷 차원에서 부터 비교하여 Shape이 같거나, 차원 중 값이 1인 것이 존재하면 가능
  • 둘중 하나라도 만족이 되지 않는다면 호환 가능하지 않음을 알리기 위해 ValueError 예외가 발생한다.
  • 연산 이후 결과로 반환되는 배열은 입력 배열들의 차원 중 가장 큰 크기로 반환된다.

브로드캐스팅 예
- 출처: https://www.tutorialspoint.com/numpy/images/array.jpg

Scalar(상수)와의 연산

import numpy as np
x = np.zeros((3, 3))
print(x)
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
x + 1          # -, *, **, % 등등이 사용가능
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
y = x + 10
y % 2 == 0     #boolean도 가능
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]])

Shape이 다른 경우 연산

위의 브로드 캐스팅 Rule에 shape이 다를경우 어떠한 경우에서 연산이 가능한지 설명했는데 이를 에시를 통해서 알아보도록 하겠다.

{: width="80%" height="80%"}

코드를 통해서 해당하는 결과가 나오는지 확인해보도록하겟다.

a = np.zeros((3, 3, 4))
b = np.arange(3).reshape(3, 1)
c = np.arange(12).reshape(3, 4)
d = np.arange(4).reshape(1, 4)
#1
print(a.shape)
print(b.shape)
a + b
(3, 3, 4)
(3, 1)





array([[[0., 0., 0., 0.],
        [1., 1., 1., 1.],
        [2., 2., 2., 2.]],

       [[0., 0., 0., 0.],
        [1., 1., 1., 1.],
        [2., 2., 2., 2.]],

       [[0., 0., 0., 0.],
        [1., 1., 1., 1.],
        [2., 2., 2., 2.]]])
#2
print(a.shape)
print(c.shape)
a + c
(3, 3, 4)
(3, 4)





array([[[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]],

       [[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]],

       [[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]]])
print(a.shape)
print(d.shape)
a + d
(3, 3, 4)
(1, 4)





array([[[0., 1., 2., 3.],
        [0., 1., 2., 3.],
        [0., 1., 2., 3.]],

       [[0., 1., 2., 3.],
        [0., 1., 2., 3.],
        [0., 1., 2., 3.]],

       [[0., 1., 2., 3.],
        [0., 1., 2., 3.],
        [0., 1., 2., 3.]]])

boolean indexing

조건문을 이용하여 True or False로 인덱싱 하는 기법

x = np.random.randint(1, 100, size=10)
print(x)
[74 38 61 35  6 41 53 97 38  9]

브로드캐스팅을 활용하여 ndarray로 부터 bool list 얻기

even_mask = x % 2 == 0
print(even_mask)                 #bool list 를 마스크로 이름을 많이 지음
[ True  True False False  True False False False  True False]

bool 리스트를 인덱스로 전달

x[even_mask] #True인 값만 뽑아낸다
array([74, 38,  6, 38])
x[x % 2 == 0]
array([74, 38,  6, 38])

다중조건 사용하기

  • 파이썬 논리 연산지인 and, or, not 키워드 사용 불가
  • & - AND
  • | - OR
x[(x % 2 == 0) & (x > 30)] #짝수이고 30을 넘는 것들만 인덱싱
array([74, 38, 38])
profile
study blog

0개의 댓글