728x90
반응형
브로드캐스팅 (Broadcasting)
선형대수학에서 행렬의 덧셈과 뺄셈을 할 때 행렬의 크기(shape)가 같아야 하지만 넘파이에서는 차원이나 크기가 달라도 조건만 충족하면 자동으로 확장하여 연산합니다. 이를 브로드캐스팅이라고 합니다.
같은 차원일 때
import numpy as np
# [1 Dimensional Array]
a = np.full(3, 1)
# [1 1 1] int32
b = np.array([2])
# [2] int32
abAdd = a - b
print(abAdd, abAdd.dtype)
# [3 3 3] int32
# [2 Dimensional Array]
a = np.full((2, 3), 2.336)
# [[2 2 2]
# [2 2 2]] int32
b = np.array([(2, ),(4, )])
# [[2]
# [4]] int32
abAdd = a + b
print(abAdd, abAdd.dtype)
# [[4 4 4]
# [6 6 6]] int32
# [3 Dimensional Array]
a = np.full((2, 3, 4), 2)
# [[[2 2 2 2]
# [2 2 2 2]
# [2 2 2 2]]
# [[2 2 2 2]
# [2 2 2 2]
# [2 2 2 2]]] int32
b = np.array([[(0, ),(1, ),(2, )], [(3, ),(4, ),(5, )]])
# [[[0]
# [1]
# [2]]
# [[3]
# [4]
# [5]]] int32
abMul = a * b
print(abMul, abMul.dtype)
# [[[ 0 0 0 0]
# [ 2 2 2 2]
# [ 4 4 4 4]]
# [[ 6 6 6 6]
# [ 8 8 8 8]
# [10 10 10 10]]] int32
위 예제 코드와 동일한 값을 적용한 그림입니다. 1차원 배열의 크기가 다르더라도 차원이 동일하면 이런 식으로 확장하여 연산합니다.
다른 차원일 때
차원이 다른 경우에도 브로드캐스팅이 발생합니다.
a2dim = np.ones((2, 3), dtype='int32')
# [[1 1 1]
# [1 1 1]] (2, 3)
b = np.arange(3)
# [0 1 2] (3,)
a2bAdd = a2dim+b
print(a2bAdd, a2bAdd.shape)
# [[1 2 3]
# [1 2 3]] (2, 3)
a2dim = np.ones((4, 1), dtype='int32')
# [[1]
# [1]
# [1]
# [1]] (4, 1)
b = np.arange(3)
# [0 1 2] (3,)
a2bAdd = a2dim+b
print(a2bAdd, a2bAdd.shape)
# [[1 2 3]
# [1 2 3]
# [1 2 3]
# [1 2 3]] (4, 3)
a3dim = np.ones((2, 3, 3), dtype='int32')
# [[[1 1 1]
# [1 1 1]
# [1 1 1]]
# [[1 1 1]
# [1 1 1]
# [1 1 1]]] (2, 3, 3)
b = np.arange(3)
# [0 1 2] (3,)
a3bAdd = a3dim+b
print(a3bAdd, a3bAdd.ndim, a3bAdd.shape)
# [[[1 2 3]
# [1 2 3]
# [1 2 3]]
# [[1 2 3]
# [1 2 3]
# [1 2 3]]] 3 (2, 3, 3)
연산이 불가능한 경우
브로드캐스팅은 '행과 열의 크기가 서로 다른 수로 고정되어 있지 않는 한' 연산이 가능합니다.
위의 말은 브로드캐스팅이 되기 위한 최소 조건을 말합니다.
행 또는 열의 크기가 1개일 때는 더 큰 쪽에 맞춰 확장이 일어나지만, 1보다 크면서 서로 다른 수로 고정이 되어있다면 위와 같이 에러가 발생합니다.
728x90
반응형
'[R&D] 프로그래밍 > Numpy' 카테고리의 다른 글
[Numpy] 넘파이 크기가 같은 행렬의 사칙연산 (0) | 2022.07.21 |
---|---|
[Numpy] 넘파이 배열의 dtype 바꾸는 방법 (0) | 2022.07.20 |
[Numpy] 넘파이 배열 생성 및 속성 확인 방법 (0) | 2022.07.11 |
[Numpy] 넘파이란? 기본 개념 및 설치 방법 (0) | 2022.07.10 |
댓글