Python NumPy

NumPy 배열 브로드캐스팅 (Broadcasting)

PyExplorer 2025. 1. 25. 11:09
728x90

NumPy 배열 브로드캐스팅 (Broadcasting)

NumPy는 Python에서 강력한 배열 처리 기능을 제공하는 라이브러리로, 과학 계산 및 데이터 분석에 널리 사용되고 있습니다. NumPy의 주요 기능 중 하나는 브로드캐스팅(Broadcasting)입니다. 브로드캐스팅은 크기가 다른 배열 간에 연산을 수행할 때 유용하게 사용됩니다. 이번 포스팅에서는 브로드캐스팅의 개념과 활용 방법을 자세히 알아보겠습니다.


1. 브로드캐스팅이란?

브로드캐스팅은 NumPy에서 서로 다른 크기의 배열 간에 연산을 수행할 수 있도록 배열을 자동으로 확장하는 기능입니다. 예를 들어, 배열의 크기가 동일하지 않아도 NumPy는 내부적으로 더 작은 배열의 크기를 확장하여 연산을 수행합니다.

브로드캐스팅 규칙

  1. 두 배열의 축(axis)의 크기가 동일하거나, 하나의 축 크기가 1이라면 브로드캐스팅이 가능합니다.
  2. 작은 배열의 크기가 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의 브로드캐스팅은 데이터 크기를 효율적으로 조정하여 연산을 수행할 수 있도록 돕는 강력한 기능입니다. 이를 활용하면 코드의 간결성과 성능을 모두 개선할 수 있습니다. 하지만 크기 호환성 문제를 항상 염두에 두고 사용해야 합니다.

브로드캐스팅을 잘 활용하면 데이터 전처리, 벡터 연산, 머신러닝과 같은 다양한 작업에서 생산성을 크게 높일 수 있습니다.

728x90