본문 바로가기
[R&D] 프로그래밍/Numpy

[Numpy] 넘파이 행렬 연산 - 브로드캐스팅 (Broadcasting)

by Geuni 2022. 7. 24. 16:55
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)

 


연산이 불가능한 경우

브로드캐스팅은 '행과 열의 크기가 서로 다른 수로 고정되어 있지 않는 한' 연산이 가능합니다.

위의 말은 브로드캐스팅이 되기 위한 최소 조건을 말합니다.

error log

행 또는 열의 크기가 1개일 때는 더 큰 쪽에 맞춰 확장이 일어나지만, 1보다 크면서 서로 다른 수로 고정이 되어있다면 위와 같이 에러가 발생합니다.

728x90
반응형

댓글