Broadcasting in numpy
1 minute read
Broadcasting
- 모양이 다른 배열들 간의 연산이 어떤 조건을 만족했을 때 가능해지도록 배열을 자동적으로 변환하는 것.
Rules of Broadcasting
- 두 배열의 차원이 다르면, 차원이 적은 쪽은 왼쪽 에 1로 빈 차원들이 padding 된다.
- 어느 차원에서 모양이 맞지 않으면, 크기가 1인 배열이 그 차원 방향에 대해 stretch 되어서 다른 배열에 맞춘다.
- 모든 차원에서 모양이 맞지 않고 어느쪽도 크기가 1이 아니면 에러가 발생한다.
예시
- Broadcasting이 안되는 경우
>>> 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) ) 계산이 되었겠지만 양쪽 다 허용하는 경우에는 오히려 모호함이 커질 수 있기 때문에 왼쪽에 패딩을 주는 것으로 규칙이 고정되었다고 한다.
- Broadcasting이 되는 경우
>>> 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
-
reshape
>>> x = np.arange(3) >>> x array([0, 1, 2]) >>> x.shape (3,) >>> x.reshape(3,1) array([[0], [1], [2]])
- 어떤 배열에 reshape 을 하면, 기존 배열이 저장되어있는 변수가 갱신되는 것이 아니라
reshape
을 적용했을때의 view 만 제공된다.
- 어떤 배열에 reshape 을 하면, 기존 배열이 저장되어있는 변수가 갱신되는 것이 아니라
-
newaxis
- 흔히 배열의 차원을 1차원에서 2차원 행렬로 만들어야 하는데, 그러한 경우에는
reshape
대신newaxis
를 사용할 수도 있다. -
>>> x = np.arange(3) >>> x array([0, 1, 2]) >>> x[:, np.newaxis] array([[0], [1], [2]])
- 흔히 배열의 차원을 1차원에서 2차원 행렬로 만들어야 하는데, 그러한 경우에는
참고자료