Broadcasting이란 numpy 라이브러리의 기능 중 하나를 의미합니다. 영어로는 방송하다 정도의 의미를 가지고 있지만, numpy 라이브러리에선 조금 다른 의미로 사용됩니다.
브로드 캐스팅이란 산술연산이 되는 배열(array)에서 모양(shape)이 다른 경우에도, 연산이 가능하도록 배열들의 모양을 처리하는 방법을 의미합니다.
즉, 일정 조건을 부합하는 다른 형태의 배열끼리 연산을 수행하게 해줍니다.
더 작은 배열이 더 큰 배열에 '브로드캐스트'되어 호환되는 모양을 가집니다.
import numpy as np
arr = np.arange(1, 4) # [1 2 3]
x = 2
print(arr * x) # [2 4 6]
브로드 캐스팅의 규칙
1. 둘 중 하나의 배열이 1차원 배열인 경우, 브로드 캐스팅 가능 -> 위의 사진과 같다.
2. 두 배열의 짝이 맞을 때 브로드 캐스팅 가능
ex) [4, 1] 과 [1, 4]는 짝이 맞아 브로드 캐스팅 가능
3. 두 배열이 뒤에서 부터 대응하는 축의 크기가 동일하거나, 1이어야만 한다.
ex) [3, 1, 5]과 [ -, 4, 5]의 경우 맨 뒤는 5로 동일하고, 1과 4중 하나가 1이기 때문에 브로드 캐스팅이 가능합니다.
곱셈 진행시 마지막 차원은 둘다 5로 일치하지만, arr1은 3차원, arr2는 2차원이기 때문에 arr1의 앞 차원을 arr2에 맞춰주기 위해 arr1의 차원을 자동으로 복사하여 arr1은 (3, 4, 5)가 되어 (-, 4, 5)랑 곱셈이 가능해집니다.
arr1 = np.arange(15).reshape(3, 1, 5)
arr2 = np.arange(20).reshape( 4, 5)
print(arr1 * arr2)
# arr1은
# [[[ 0 1 2 3 4]]
# [[ 5 6 7 8 9]]
# [[10 11 12 13 14]]]
# arr2는
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
>>> [[[ 0 1 4 9 16] -> arr1의 1행과 arr2의 1행 곱셈
[ 0 6 14 24 36] -> arr1의 1행과 arr2의 2행 곱셈
[ 0 11 24 39 56] -> arr1의 1행과 arr2의 3행 곱셈
[ 0 16 34 54 76]] -> arr1의 1행과 arr2의 4행 곱셈
[[ 0 6 14 24 36] -> arr1의 2행과 arr2의 1행 곱셈
[ 25 36 49 64 81] -> arr1의 2행과 arr2의 2행 곱셈
[ 50 66 84 104 126] -> arr1의 2행과 arr2의 3행 곱셈
[ 75 96 119 144 171]] -> arr1의 2행과 arr2의 4행 곱셈
[[ 0 11 24 39 56] -> arr1의 3행과 arr2의 1행 곱셈
[ 50 66 84 104 126] -> arr1의 3행과 arr2의 2행 곱셈
[100 121 144 169 196] -> arr1의 3행과 arr2의 3행 곱셈
[150 176 204 234 266]]] -> arr1의 3행과 arr2의 4행 곱셈
ex) [3, 2, 5]와 [-, 3, 5]는 맨 뒤가 5로 동일하지만, 2와 3이 서로 다르기 때문에 브로드 캐스트가 불가능합니다.
또한 np.arange(15).reshape(3, 2, 5)는 3 * 2 * 5 = 30이기 때문에 15가 아니기에 생성할 수 없습니다.
np.arange(20).reshape( 3, 5)도 3 * 5 = 15이므로 20이 아니기에 생성이 아니어서 생성할 수 없습니다.
arr1 = np.arange(15).reshape(3, 2, 5)
arr2 = np.arange(20).reshape( 3, 5)
print(arr1 * arr2)
>>> ---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[58], line 1
----> 1 arr1 = np.arange(15).reshape(3, 2, 5)
2 arr2 = np.arange(20).reshape( 3, 5)
3 print(arr1 * arr2)
ValueError: cannot reshape array of size 15 into shape (3,2,5)
또한 (4 x 3)과 (1 x 4)도 mismatch입니다.
각 배열의 맨 뒤 숫자가 3과 4로 일치하지 않기 때문입니다.
'[머신러닝] > [Numpy, Pandas]' 카테고리의 다른 글
[Numpy] np.arange 사용법과 range와의 차이 (0) | 2023.06.16 |
---|---|
[Pandas] 판다스 설치 (0) | 2023.06.15 |
[Numpy] list와 tuple 자료형의 차이 (0) | 2023.06.14 |
[Numpy] 파이썬 list comprehension (0) | 2023.06.14 |
[Numpy] 파이썬 Numpy란? shape(axis), ndim, size, reshape (0) | 2023.06.13 |