본문 바로가기
Python/NumPy

NumPy(넘파이)에서의 Broadcasting(브로드캐스팅) - NumPy(7)

by 콩돌 2019. 2. 10.
반응형

참고 자료

https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html



파이썬 버전 3.7 기준

NumPy 버전 1.16 기준


본 포스팅에서는 NumPy에서의 Broadcasting을 다룬다.



NumPy에서의 Broadcasting


브로드캐스팅의 개념

브로스캐스팅의 개념
  ○ 넘파이에서 브로드캐스팅이라는 용어는 서로 다른 배열 형상에서 산술 연산을 어떻게 처리할 것인가를 의미한다.
  ○ 확실한 제약을 조건으로하여, 더 작은 배열이 브로드캐스트되는데 이는 이쪽이 호환성이 더 좋기 때문이다.
  ○ 브로드캐스팅은 파이썬 대신에 C언어의 루핑으로 배열연산에서 벡터화하는 방법을 제공한다.

    ▷ 이것은 필요없는 데이터의 복사본을 만들지 않고 효율적인 알고리즘 실행을 가능하게 한다. 


   ○ 쉽게 설명하면 작은 쪽(1개의 요소를 가지는)의 배열을 큰 쪽의 배열 크기로 확장시켜 연산시키는 것이다.


넘파이의 배열 연산과 브로스캐스팅

  ○ 넘파이 연산은 요소 대 요소를 기반으로 수행되어진다. 가장 단순한 경우로써 두 배열이 정확히 같은 경우가 있다.

  ○ 넘파이의 브로드캐스팅 룰은 연산에 사용되는 배열은 같은 형상이어야 한다는 제약을 완화한다. 

  ○ 가장 단순한 브로드캐스팅 예제는 하나의 스칼라와 배열 간의 연산이다. 

  ○ 브로드캐스팅을 적절히 잘 활용할 경우 메모리를 효율적으로 사용하여 더욱더 효율적인 코드를 작성할 수 있다. 

    ▷ 그러나 가끔씩 브로드캐스팅이 메모리를 비효율적으로 사용하여 계산을 느리게 만들게 되는 경우도 존재한다.


단순한 예)

# 브로드캐스팅을 사용하지 않을 경우의 넘파이 연산

In[3]: x = np.array([1,2,3,4,5])

In[4]: y = np.array([1,1,1,1,1])

In[5]: x+y

Out[5]: array([2, 3, 4, 5, 6])


# 브로드캐스팅을 사용할 경우의 넘파이 연산

In[6]: y = 1

In[7]: x+y

Out[7]: array([2, 3, 4, 5, 6])



일반적인 브로드캐스팅 룰


  ○ 두 배열을 연산시킬때, 넘파이에서는 먼저 배열들의 각 차원의 요소 수와 같은 형상을 비교한다. 

    ▷ 비교할 때 끝쪽 차원부터 비교하기 시작하며 앞쪽 방향으로 진행한다. 

  ○ 비교되는 차원은 아래와 같은 상황에서 호환 가능하다고 본다.

    ① 차원에서 요소수가 동등하다.

    ② 둘중 하나의 차원의 요소수가 1이다.


  ○ 둘중에 하나로 만족이 되지 않는다면 호환가능하지 않음을 알리기 위해 ValueError 예외가 발생한다.

  ○ 연산 이후 결과로 반환되는 배열은 입력 배열들의 차원 중 가장 큰 크기로 반환된다.


배열의 브로드캐스팅이 가능한 예제)

A   (4d 배열): 8 x 1 x 6 x 1 

B   (3d 배열):    7 x 1 x 5 

───────────────

Result (4d 배열): 8 x 7 x 6 x 5 


A   (2d 배열): 5 x 4

B   (1d 배열):    1

────────────

Result (2d 배열): 5 x 4


A   (2d 배열): 5 x 4

B   (1d 배열):    4

────────────

Result (2d 배열): 5 x 4


A   (3d 배열): 15 x 3 x 5

B   (3d 배열): 15 x 1 x 5

───────────────

Result (3d 배열): 15 x 3 x 5


A   (3d 배열): 15 x 3 x 5

B   (2d 배열):      3 x 5

──────────────

Result (3d 배열): 15 x 3 x 5


A   (3d 배열): 15 x 3 x 5

B   (2d 배열):      3 x 1

──────────────

Result (3d 배열): 15 x 3 x 5 


배열의 브로드캐스팅이 불가능한 예제)

A   (1d 배열): 3

B   (1d 배열): 4


A   (2d 배열):    2 x 1

B   (3d 배열): 8 x 4 x 3



반응형

댓글