Broadcasting in numpy
1 minute read

Broadcasting

Rules of Broadcasting

  1. 두 배열의 차원이 다르면, 차원이 적은 쪽은 왼쪽 에 1로 빈 차원들이 padding 된다.
  2. 어느 차원에서 모양이 맞지 않으면, 크기가 1인 배열이 그 차원 방향에 대해 stretch 되어서 다른 배열에 맞춘다.
  3. 모든 차원에서 모양이 맞지 않고 어느쪽도 크기가 1이 아니면 에러가 발생한다.

예시

>>> import numpy as np
>>> a = np.ones([3,4])
>>> b = np.arange(3)
>>> a
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
>>> b
array([0, 1, 2])
>>> a.shape, b.shape
((3, 4), (3,))
>>> a+b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3,4) (3,)

만약 차원 패딩이 오른쪽에 되었더라면 ( (3,) -> (3,1) ) 계산이 되었겠지만 양쪽 다 허용하는 경우에는 오히려 모호함이 커질 수 있기 때문에 왼쪽에 패딩을 주는 것으로 규칙이 고정되었다고 한다.

>>> c = np.ones([3,1])
>>> c
array([[1.],
       [1.],
       [1.]])
>>> c.shape
(3, 1)
>>> a+c
array([[2., 2., 2., 2.],
       [2., 2., 2., 2.],
       [2., 2., 2., 2.]])

Reshaping arrays

  1. reshape
    >>> x = np.arange(3)
    >>> x
    array([0, 1, 2])
    >>> x.shape
    (3,)
    >>> x.reshape(3,1)
    array([[0],
        [1],
        [2]])
    
    • 어떤 배열에 reshape 을 하면, 기존 배열이 저장되어있는 변수가 갱신되는 것이 아니라 reshape 을 적용했을때의 view 만 제공된다.
  2. newaxis
    • 흔히 배열의 차원을 1차원에서 2차원 행렬로 만들어야 하는데, 그러한 경우에는 reshape 대신 newaxis 를 사용할 수도 있다.
    • >>> x = np.arange(3)
      >>> x
      array([0, 1, 2])
      >>> x[:, np.newaxis]
      array([[0],
       [1],
       [2]])
      

참고자료 :link:

Recent Posts

Matrix Calculus
Inverted Indexing
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Deep Contextualized Word Representations
Pretraining-Based Natural Language Generation for Text Summarization