프로그래밍 언어/python

numpy array broadcasting

이현찬 2022. 7. 26. 22:09
728x90

Numpy를 활용한 배열 연산

  • numpy는 python에서 텐서 연산을 효율적으로 수행할 수 있도록 해주는 라이브러리
  • 수학적으로 벡터의 요소별 연산을 할 때, 텐서의 shape이 일치하지 않으면 계산할 수 없음
  • 예를 들어, $x = [1, 2, 3]$인 3차원 벡터의 각 요소에 1씩 더해주려면 x + np.array([1,1,1])처럼 계산
  • 하지만 numpy에서는 배열의 형태가 달라도 의도한 계산을 할 수 있는 broadcasting을 지원하기 때문에 x + 1로 같은 결과를 얻음

  • 2차원 배열에서도 다음과 같이 broadcasting이 적용된 연산을 할 수 있음.

Broadcasting rule

  • 위의 예시에서는 낮은 차원의 예시이기 때문에 쉽게 이해하고 적용할 수 있지만, 차원이 높아짐에 따라 규칙을 명확하게 이해하기 어려워짐
  • 두 가지 규칙을 기억하고 적용하면 broadcasting을 적용할 수 있음
    1. 마지막 shape에 맞게 정렬
    2. 비어있는 axis나, 값이 1인 axis의 차원이 바뀐다.

Example

  • 아래 그림은 broadcasting을 통해 3차원 텐서와 2차원 텐서의 연산을 수행하는 과정을 보임

  • 차원이 낮은 Tensor 2(2차원)이 Tensor 3(3차원)의 shape에 맞추어 계산됨
  • 아래 그림처럼 규칙에 맞게 마지막 axis를 맞게 정렬하면 노란색으로 하이라이트된 부분이 비어있기 때문에 이 부분이 Tensor 1의 axis 0에 맞춰져 계산됨


Example 2

  • Tensor1(5,3), Tensor2(8, 5, 1), Tensor3(8, 1, 3) 의 shape을 갖는 세 텐서의 연산을 수행한다고 하면 결과 Tensor4의 shape은 (8,5,3)으로 예상할 수 있다.

마무리

  • numpy의 broadcasting에 대한 더 많은 예시는 공식 문서1나 이 책2을 참조
  • matrix 곱에 대한 내용은 이 문서를 참조

Reference

[1] numpy broadcasting docs
[2] Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython