NumPy 배열 브로드캐스팅 (Broadcasting)
NumPy는 Python에서 강력한 배열 처리 기능을 제공하는 라이브러리로, 과학 계산 및 데이터 분석에 널리 사용되고 있습니다. NumPy의 주요 기능 중 하나는 브로드캐스팅(Broadcasting)입니다. 브로드캐스팅은 크기가 다른 배열 간에 연산을 수행할 때 유용하게 사용됩니다. 이번 포스팅에서는 브로드캐스팅의 개념과 활용 방법을 자세히 알아보겠습니다.
1. 브로드캐스팅이란?
브로드캐스팅은 NumPy에서 서로 다른 크기의 배열 간에 연산을 수행할 수 있도록 배열을 자동으로 확장하는 기능입니다. 예를 들어, 배열의 크기가 동일하지 않아도 NumPy는 내부적으로 더 작은 배열의 크기를 확장하여 연산을 수행합니다.
브로드캐스팅 규칙
- 두 배열의 축(axis)의 크기가 동일하거나, 하나의 축 크기가 1이라면 브로드캐스팅이 가능합니다.
- 작은 배열의 크기가 1인 축은 큰 배열의 크기에 맞춰 확장됩니다.
아래 예제를 통해 브로드캐스팅 규칙을 이해해봅시다.
import numpy as np
# 배열 생성
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([10, 20, 30])
# 브로드캐스팅을 활용한 연산
C = A + B
print(C)
출력 결과:
[[11 22 33]
[14 25 36]]
여기서 A
는 (2, 3) 크기의 배열이고, B
는 (3,) 크기의 1차원 배열입니다. B
는 내부적으로 (2, 3) 크기로 확장되어 연산이 수행됩니다.
2. 브로드캐스팅의 시각적 이해
예제 1: 스칼라와 배열 간의 연산
A = np.array([[1, 2, 3], [4, 5, 6]])
B = 10
C = A + B
print(C)
출력 결과:
[[11 12 13]
[14 15 16]]
여기서 B
는 스칼라이며, (1, 1) 크기의 배열로 간주됩니다. 이 배열은 A
와 동일한 크기인 (2, 3)으로 확장됩니다.
예제 2: 1차원 배열과 2차원 배열 간의 연산
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([10, 20, 30])
C = A * B
print(C)
출력 결과:
[[ 10 40 90]
[ 40 100 180]]
여기서 B
는 (3,) 크기의 배열이며, (2, 3) 크기로 확장됩니다.
3. 브로드캐스팅의 실제 활용 사례
예제 1: 데이터 정규화
브로드캐스팅은 데이터 전처리 과정에서 자주 사용됩니다. 예를 들어, 각 열(column)의 값을 정규화(normalization)하려면 다음과 같이 수행할 수 있습니다.
# 배열 생성
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 열별 평균과 표준편차 계산
mean = X.mean(axis=0)
std = X.std(axis=0)
# 정규화 수행
X_normalized = (X - mean) / std
print(X_normalized)
출력 결과:
[[-1.22474487 -1.22474487 -1.22474487]
[ 0. 0. 0. ]
[ 1.22474487 1.22474487 1.22474487]]
예제 2: 유클리드 거리 계산
브로드캐스팅은 두 점 간의 유클리드 거리를 계산할 때도 유용합니다.
# 두 점의 좌표
points = np.array([[1, 2], [3, 4], [5, 6]])
query_point = np.array([0, 0])
# 거리 계산
distances = np.sqrt(((points - query_point) ** 2).sum(axis=1))
print(distances)
출력 결과:
[ 2.23606798 5. 7.81024968]
여기서 query_point
는 (2,) 크기의 배열이며, points
와 동일한 크기로 확장됩니다.
4. 브로드캐스팅의 주의점
1. 메모리 사용
브로드캐스팅은 배열을 물리적으로 복사하지 않고 연산을 수행하므로 메모리 사용이 효율적입니다. 하지만 너무 큰 배열을 다룰 때는 여전히 메모리 문제가 발생할 수 있습니다.
2. 연산 오류
브로드캐스팅이 항상 가능한 것은 아닙니다. 크기가 호환되지 않는 배열 간의 연산을 시도하면 오류가 발생합니다.
A = np.array([1, 2, 3])
B = np.array([[1, 2], [3, 4]])
# 오류 발생
C = A + B
출력 결과:
ValueError: operands could not be broadcast together with shapes (3,) (2,2)
5. 결론
NumPy의 브로드캐스팅은 데이터 크기를 효율적으로 조정하여 연산을 수행할 수 있도록 돕는 강력한 기능입니다. 이를 활용하면 코드의 간결성과 성능을 모두 개선할 수 있습니다. 하지만 크기 호환성 문제를 항상 염두에 두고 사용해야 합니다.
브로드캐스팅을 잘 활용하면 데이터 전처리, 벡터 연산, 머신러닝과 같은 다양한 작업에서 생산성을 크게 높일 수 있습니다.
'Python NumPy' 카테고리의 다른 글
NumPy 배열의 형태 변경 [ reshape, ravel, flatten ] (0) | 2025.01.27 |
---|---|
NumPy 유니버설 함수 (Universal Functions, ufunc) 알아보기 (0) | 2025.01.26 |
NumPy Array 기본 산술 연산 (0) | 2025.01.24 |
NumPy 슬라이싱 및 배열의 복사와 뷰 (0) | 2025.01.23 |
NumPy 배열의 인덱싱 이해하기 (0) | 2025.01.22 |