브로드캐스팅(Broadcasting)은 넘파이에서 크기가 다른 배열들 간의 연산을 할 수 있게 해주는 강력한 기능이다. 일반적으로 크기가 같은 배열끼리만 요소별 연산이 가능하지만, 브로드캐스팅은 크기가 다른 배열끼리도 연산이 가능하게 만들어준다..
[브로드캐스팅의 동작원리]
[브로드캐스팅 규칙]
- 두 배열의 차원이 다른 경우, 더 적은 차원을 가진 배열 Shape의 앞쪽은 1로 채워 차원을 증가시킨다.
- 두 배열의 Shape가 일치하지 않는다면, 일치하지 않는 차원의 Shape가 1인 배열이 다른 Shape와 일치하도록 늘어난다.
- 임의의 차원에서 크기가 일치하지 않고, 1도 아닌 경우에는 오류가 발생하다.
1. 더 적은 차원을 가진 배열은 Shape
의 앞쪽이 1로 채워져 차원이 증가한다.
두 배열의 차원이 다를 때, 차원이 더 적은 배열은 1
로 채워져 차원을 맞춘다. 예를 들어, 1차원 배열과 2차원 배열을 더할 때, 1차원 배열은 2차원 배열의 행의 수에 맞춰 확장된다.
예시 1: 1차원 배열과 2차원 배열 간의 브로드캐스팅
import numpy as np
# 2x3 배열 (2차원 배열)
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
# 1차원 배열
arr1d = np.array([10, 20, 30])
# 브로드캐스팅을 통해 차원 확장
result = arr2d + arr1d
print("2차원 배열과 1차원 배열의 덧셈 결과:\n", result)
결과:
2차원 배열과 1차원 배열의 덧셈 결과:
[[11 22 33]
[14 25 36]]
설명:
arr1d
는 (3,) 크기의 1차원 배열이고,arr2d
는 (2, 3) 크기의 2차원 배열이다.arr1d
는 자동으로(1, 3)
으로 변환되어arr2d
와 크기를 맞춘다. 그 결과, 2차원 배열이 만들어짐.
2. 두 배열의 Shape가 일치하지 않는다면, 일치하지 않는 차원의 Shape가 1인 배열이 다른 배열의 Shape와 일치하도록 늘어난다.
이 규칙은 배열의 크기가 1인 차원이 있을 경우, 그 차원이 다른 배열의 크기와 일치하도록 확장된다는 의미야. 이때, 배열은 해당 차원의 값이 복사되는 것처럼 동작한다.
예시 2: 3x1 배열과 1x3 배열의 브로드캐스팅
# 3x1 배열
arr3x1 = np.array([[1],
[2],
[3]])
# 1x3 배열
arr1x3 = np.array([10, 20, 30])
# 브로드캐스팅을 통해 배열의 크기를 맞춤
result = arr3x1 + arr1x3
print("3x1 배열과 1x3 배열의 덧셈 결과:\n", result)
결과:
3x1 배열과 1x3 배열의 덧셈 결과:
[[11 21 31]
[12 22 32]
[13 23 33]]
설명:
arr3x1
은 (3, 1) 크기의 배열이고,arr1x3
은 (1, 3) 크기의 배열이다.- 넘파이는 자동으로 두 배열을 (3, 3) 크기로 확장하여, 각각의 값들이 요소별로 더해진다.
arr3x1
의 열이 1이므로, 각 값이arr1x3
와 동일한 크기가 될 때까지 복사되어 덧셈이 이루어진다..
3. 임의의 차원에서 크기가 일치하지 않고, 1도 아닌 경우에는 오류가 발생한다.
만약 두 배열의 Shape에서 일치하지 않는 차원의 크기가 다르고, 그 크기가 1도 아니라면 브로드캐스팅은 불가능하고 오류가 발생한다.
예시 3: 크기가 맞지 않아서 발생하는 오류
# 2x3 배열
arr2x3 = np.array([[1, 2, 3],
[4, 5, 6]])
# 3x2 배열
arr3x2 = np.array([[1, 2],
[3, 4],
[5, 6]])
# 두 배열의 크기가 맞지 않아 오류 발생
result = arr2x3 + arr3x2 # 이 줄에서 오류 발생
결과:
ValueError: operands could not be broadcast together with shapes (2,3) (3,2)
설명:
arr2x3
은 (2, 3) 크기의 배열이고,arr3x2
는 (3, 2) 크기의 배열이다.- 각 차원의 크기가 서로 맞지 않고, 두 배열의 어떤 차원도 1이 아니기 때문에 브로드캐스팅이 불가능하고 오류가 발생한다.
- 이런 경우에는 배열의 모양을 맞춰주지 않으면 연산을 할 수 없다.
중요:
브로드캐스팅이 되려면 반드시 둘 중 하나가 1차원일 필요는 없고, 각 차원에서 크기가 일치하거나 1인 차원이 있어야 브로드캐스팅이 가능
'2학년 2학기 > 데이터 사이언스 입문' 카테고리의 다른 글
Fancy Indexing (0) | 2024.10.05 |
---|---|
비교, 마스크, Bool 연산 (0) | 2024.10.05 |
Numpy - Ufunc (1) | 2024.09.26 |
Numpy - 배열 내 요소 접근(인덱싱과 슬라이싱) (0) | 2024.09.26 |
Numpy - ndarray의 속성 (0) | 2024.09.26 |