numpy broadcasting

yuns_u·2021년 7월 24일
0

numpy broadcasting이란?

Broadcasting : 모양이 다른 배열들간의 조건을 만족했을 때 가능해지도록 배열을 자동적으로 변환하는 것. 반복확장을 통한 차원 확장이라고 할 수 있다.

Broadcasting의 조건 (둘 중 하나는 만족해야 broadcast가 가능해진다.)
(1) 최소 하나의 배열의 차원의 크기가 1이다. = 두 넘파이 배열 중 최소한 하나의 배열의 어떤 축이든 간에 차원이 1이다.
(2) 뒤에서부터 대응하는 축의 길이가 동일하다. = 두 넘파일 배열의 차원에 대해서 축의 길이가 동일하다. = 각 차원별로 짝이 맞아야한다.

numpy를 활용해서 다른 모양의 배열 간의 연산을 수행할 때 꼭 이해해야 하는 개념이다. (다른 모양의 벡터들이나 행렬을 연산할 때 사용하는 것 같다.)

broadcast란 단어는 무언가를 '흩뿌리고 퍼뜨리고 전파'할 때 사용한다. 방송도 뉴스를 흩뿌리고 퍼뜨려서 전파를 하듯이 여기에서 쓰인 의미는 이렇게 흩뿌리고 퍼뜨려서 전파한다는 의미인 것 같다.

일반적으로 numpy에서는 모양이 다른 배열끼리는 연산하지 못한다.

a = np.array([1,2,3])
b = np.array([4,5])
a+b

>>>ValueError                                Traceback (most recent call last)
<ipython-input-169-f96fb8f649b6> in <module>()
----> 1 a + b

ValueError: operands could not be broadcast together with shapes (3,) (2,)

이 때 에러메시지를 보면 broadcast가 되지 못했다라는 내용이 나온다.
즉, 어떤 조건을 만족하면 모양이 다른 배열도 연산이 가능할 것이다.

broadcast는 어떤 조건만 만족한다면 모양이 다른 배열끼리의 연산을 가능하게 해주며 모양이 부족한 부분은 확장하여 연산을 수행할 수 있도록 한다는 것이라고 생각할 수 있다. 확장 또는 전파한다는 의미로 Broadcasting을 설명하는 가장 간단한 예는 배열과 스칼라 값을 계산하는 것이다. 왜냐하면 스칼라만을 갖고 있는 배열은 차원의 크기가 1이기 때문에 어떤 배열에 연산을 해도 broadcasting이 가능하기 때문이다.

시각적으로 확인하기


이미지 출처
위의 이미지의 첫 번째는 array [0,1,2]에 스칼라 5를 합한 결과를 보여준다. 일반적인 파이썬 리스트를 사용하면 for문을 이용해서 리스트 속에 5를 더한다는 조건문을 만들어서 실행시켜야 [5,6,7]과 같은 결과를 얻을 수 있지만 NumPy에서는 브로드캐스트의 개념 덕분에 5가 0이외 1과 2의 원소 부분에도 전파(broadcast)되어 계산되어 간단하게 합 연산을 수행하는 것만으로 같은 결과를 얻을 수 있다.

두 번째는 배열 간의 계산으로 배열의 차원이 확대된 결과를 보여준다. 3x3배열에 1x3의 배열을 합하는 경우이다. 이 경우 각 행에 동일한 계산을 전파(broadcast)한 것을 확인할 수 있다. 한 쪽의 낮은 차원의 배열이 아래 방향으로 broadcast된 것이다. 차원에 대해 축의 길이가 동일하기 때문에 1x3의 배열이 broadcasting되어 3x3배열로 전환되어 연산되었다.

세 번째는 3x1배열과 1x3배열을 합하는 경우이다. 이 경우 두 배열에 대해서 broadcast된 것을 확인할 수 있다. 최소 하나의 배열의 차원의 크기가 1이라는 조건을 만족하였기 때문에 3x1배열은 길이가 1인 차원에 대해서 broadcasting되어 반복확장되어3x3배열이 되었고 1x3배열은 길이가 1인 차원에 대해서 broadcasting되어 반복확장되어 3x3배열이 되어 확장된 두 배열 간의 연산이 가능하게 되었다. 즉, 각 배열이 각각의 축에 따라 확장되었다는 점에서 위의 두 예시와는 약간의 차이점이 있다.

참고자료 1
참고자료 2

참고자료 2를 통해 broadcasting이 되는 경우아 안되는 경우의 예제를 살펴보자!

💎 유용성

  • 반복되는 데이터가 있을 경우 복사본을 만들지 않을 수 있어서 효율적인 알고리즘 실행을 가능하게 한다.
  • 적절하게 잘 활용한다면 메모리를 효율적으로 사용할 수 있다.
profile
💛 공부 블로그 💛

0개의 댓글