브로드캐스팅(Broadcasting)은 파이썬의 Numpy 라이브러리에서 배열 간의 연산을 보다 간단하고 효율적으로 수행할 수 있게 하는 강력한 기능입니다. 개념부터 사용 예까지 아래 내용을 확인해 보세요.
브로드캐스팅의 개념
NumPy에서 두 배열 간 연산은 기본적으로 동일한 모양(shape)을 요구합니다. 그러나 브로드캐스팅은 작은 배열을 자동으로 확장하여 큰 배열과 호환되도록 만들어줍니다. 이 과정에서 실제로 배열의 크기를 변경하지 않고, 연산 시 논리적으로 확장된 것처럼 처리합니다.
다음은 브로드캐스의 기본 예제입니다. 이 코드에서 b는 스칼라 값으로, 배열 a의 크기와 맞추기 위해 자동으로 확장된 것처럼 연산이 수행됩니다.
import numpy as np
# 크기가 다른 두 배열
a = np.array([1, 2, 3]) # (3,)
b = 2 # 스칼라 값
# 브로드캐스팅으로 연산 수행
result = a + b
print(result) # 출력: [3 4 5]
브로드캐스팅의 규칙
브로드캐스팅이 작동하려면 배열이 특정 조건을 충족해야 합니다. NumPy는 배열의 모양을 비교하여 다음 규칙에 따라 브로드캐스팅을 수행합니다
import numpy as np
# 서로 다른 모양의 배열
a = np.array([[1], [2], [3]]) # (3, 1)
b = np.array([10, 20, 30]) # (3,)
# 브로드캐스팅 연산
result = a + b
print(result)
# 출력:
# [[11 21 31]
# [12 22 32]
# [13 23 33]]
규칙 1에 따라 배열 b가 더 작은 차원을 가지므로 왼쪽을 1로 채워 모양을 (1, 3)으로 만듭니다.
규칙 2에 따라 (3, 1)인 a 배열과 (1, 3)인 b 배열의 크기가 다르므로, 각 차원을 그에 대응하는 다른 배열의 크기에 일치하도록 늘립니다. 이에 따라 a 배열과 b 배열은 각각 (3, 3)인 모양으로 변경됩니다.
브로드캐스팅의 장점
별도의 반복문 없이 배열 간 연산을 간단히 표현할 수 있기 때문에 코드를 간결하게 작성할 수 있습니다. for문을 많이 사용하게 되면 코드도 복잡하고 연산 속도도 늦어지게 됩니다.
실제 배열을 확장하지 않으므로 메모리를 절약할 수 있습니다. 연산의 결과는 배열이 확장된 상태가 되지만 실제 배열은 변화되지 않습니다.
NumPy는 C로 구현되어 있어 브로드캐스팅을 통한 연산이 매우 빠릅니다. For문의 사용이 줄어들게 되는 면에서도 연산이 빨라질 수 있습니다.
아래는 for 반목문과 브로드캐스팅을 비교하는 코드입니다.
# 반복문 방식
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
result = np.zeros_like(a)
for i in range(len(a)):
result[i] = a[i] + b[i]
print(result) # 출력: [11 22 33]
# 브로드캐스팅 방식
result = a + b
print(result) # 출력: [11 22 33]
브로드캐스팅의 실제 활용 사례
데이터 스케일링
이전 포스팅에서 데이터 전처리에 numpy 라이브러리를 사용한다고 했습니다. numpy의 브로드캐스팅을 이용하면 데이터 정규화(normalization)를 쉽게 짤 수 있습니다.
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mean = data.mean(axis=0) # 각 열의 평균
std = data.std(axis=0) # 각 열의 표준편차
# 각 열을 정규화
normalized_data = (data - mean) / std
print(normalized_data)
거리 계산
브로드캐스팅은 벡터 간의 거리 계산에도 사용됩니다.
points = np.array([[1, 2], [3, 4], [5, 6]])
query_point = np.array([2, 3])
# 모든 점과의 유클리드 거리 계산
distances = np.sqrt(((points - query_point) ** 2).sum(axis=1))
print(distances)
브로드캐스팅 사용 시 주의사항
브로드캐스팅의 장점이 있다면 물론 한계도 존재합니다. 이와 같은 사실을 잘 인지하고 있어야 더욱 명확한 데이터 처리 코드를 작성할 수 있습니다.
브로드캐스팅이 자동으로 수행되므로, 예상치 못한 결과를 초래할 수 있습니다. 배열의 모양(shape)이 생각한데로 변경되지 않을 수 있습니다. 따라서 조금 더 복잡한 연산에서는 배열의 모양을 명확하게 만들어줘야 합니다.
매우 복잡한 배열 간 연산에서는 브로드캐스팅 규칙을 이해하기 어렵습니다. 이 또한 의도하지 않은 결과가 나올 수 있습니다. 대규모 배열의 경우, 계산 중 메모리 사용량이 급격히 증가할 수 있습니다.
브로드캐스팅의 한계점은 모두 복잡한 배열에서 나타납니다. 브로드캐스팅 기법은 가급적 단순하고 명확한 배열에서 사용해야 합니다.
배열 연산을 위한 브로드캐스팅 설명을 마치며
파이썬에서 브로드캐스팅은 간결한 배열 연산을 가능하게 하는 매우 유용한 기능입니다. 이를 통해 대규모 데이터를 효율적으로 처리할 수 있으며, 특히 데이터 과학과 머신러닝에서 널리 활용됩니다.
하지만 항상 브로드캐스팅 규칙을 염두에 두고, 예상치 못한 동작을 방지하기 위해 코드를 신중히 작성해야 합니다. 브로드캐스팅을 이해하고 활용하면 파이썬에서의 데이터 처리 및 분석 능력을 한 단계 끌어올릴 수 있을 겁니다.