브로드캐스팅 규칙
명시적으로 복제하지 않고 1차원 배열을 2차원 배열의 모든 행에 더할 수 있도록 NumPy의 브로드캐스팅 규칙을 이해합니다.
브로드캐스팅 규칙은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
브로드캐스팅이 해결하는 문제
브로드캐스팅을 사용하면 서로 다르지만 호환되는 형상의 배열을 데이터 복사 없이 결합할 수 있습니다. 더 작은 배열을 더 큰 배열에 맞게 늘려 사용합니다.
import numpy as np
# Adding a scalar to an array is the simplest broadcast
a = np.array([1, 2, 3])
print(a + 10) # [11 12 13]
# Scalar 10 is 'broadcast' to shape (3,)브로드캐스팅 규칙 1: 왼쪽에 1 추가하기
NumPy는 오른쪽을 기준으로 형상을 맞춥니다. 한 배열의 차원 수가 더 적으면 왼쪽에 1을 채웁니다. 따라서 (3,) 배열은 (4, 3) 배열 옆에서 (1, 3)처럼 동작합니다.
import numpy as np
m = np.ones((4, 3))
v = np.array([10, 20, 30]) # shape (3,) -> treated as (1, 3)
result = m + v # shape (4, 3)
print(result)
# [[11. 21. 31.]
# [11. 21. 31.]
# [11. 21. 31.]
# [11. 21. 31.]]브로드캐스팅 규칙 2: 크기 1인 차원 늘리기
크기가 1인 차원은 다른 배열에 맞게 늘릴 수 있으며, 실제로 데이터가 복사되지는 않습니다. 두 배열의 크기 1인 차원을 동시에 늘릴 수도 있습니다.
import numpy as np
# (3, 1) + (1, 4) --> (3, 4)
col = np.array([[1], [2], [3]]) # shape (3, 1)
row = np.array([[10, 20, 30, 40]]) # shape (1, 4)
print((col + row).shape) # (3, 4)
print(col + row)브로드캐스팅 규칙 3: 호환되지 않는 형상
두 차원의 크기가 서로 다르고 어느 쪽도 1이 아니면 브로드캐스팅이 ValueError와 함께 실패합니다. 먼저 형상을 확인하면 조용히 지나가는 버그가 아니라 명확한 오류를 확인할 수 있습니다.
import numpy as np
a = np.ones(3)
b = np.ones(4)
try:
a + b
except ValueError as e:
print(e)
# operands could not be broadcast together with shapes (3,) (4,)실전: 열 평균 빼기
자주 사용하는 방법으로, 각 행에서 각 열의 평균을 빼 데이터의 중심을 맞출 수 있습니다. keepdims=True를 사용하면 평균의 형상이 브로드캐스팅에 맞게 유지됩니다.
import numpy as np
data = np.array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
col_mean = data.mean(axis=0) # shape (3,)
centred = data - col_mean # broadcast along axis 0
print(centred)
# [[-3. -3. -3.]
# [ 0. 0. 0.]
# [ 3. 3. 3.]]실전: 행 정규화
각 행의 합을 1로 만들려면 행의 합으로 나누세요. keepdims=True를 사용하면 합의 형상이 (n, 1)로 유지되어 열 전체에 브로드캐스트됩니다.
import numpy as np
m = np.array([[1., 2., 3.],
[4., 5., 6.]])
row_sums = m.sum(axis=1, keepdims=True) # shape (2, 1)
normed = m / row_sums
print(normed.round(3))
# [[0.167 0.333 0.5 ]
# [0.267 0.333 0.4 ]]브로드캐스팅으로 외적 계산하기
한 배열을 (n, 1)로, 다른 배열을 (1, m)으로 reshape한 다음 곱하면 브로드캐스팅이 반복문 없이 전체 외적 행렬을 자동으로 만들어 줍니다.
import numpy as np
a = np.array([1, 2, 3])
b = np.array([10, 20, 30, 40])
outer = a[:, np.newaxis] * b[np.newaxis, :]
print(outer)
# [[ 10 20 30 40]
# [ 20 40 60 80]
# [ 30 60 90 120]]3차원 배열의 브로드캐스팅
브로드캐스팅은 어떤 차원에도 적용할 수 있습니다. (100, 28, 28) 형상의 이미지 묶음은 (1, 28, 28) 형상의 픽셀별 평균을 사용해 중심을 맞출 수 있습니다. NumPy가 1인 차원을 늘려 줍니다.
import numpy as np
batch = np.random.rand(100, 28, 28) # 100 images
pixel_mean = batch.mean(axis=0, keepdims=True) # (1, 28, 28)
centred = batch - pixel_mean # (100, 28, 28)
print(centred.shape) # (100, 28, 28)명시적으로 늘릴 때 사용하는 np.broadcast_to
np.broadcast_to는 복사 없이 읽기 전용 뷰로 브로드캐스팅 결과를 정확하게 보여 줍니다. 형상이 어떻게 맞춰지는지 이해하기에 좋습니다.
import numpy as np
a = np.array([1, 2, 3])
view = np.broadcast_to(a, (4, 3))
print(view)
# [[1 2 3]
# [1 2 3]
# [1 2 3]
# [1 2 3]]
print(view.flags.writeable) # False호환되는 형상 시각화하기
유용한 규칙은 오른쪽부터 형상을 맞춘 뒤 각 쌍을 확인하는 것입니다. 두 값이 같거나 둘 중 하나가 1이면 호환됩니다. 코드를 실행하기 전에 결과 형상을 예측해 보세요!
# Shape compatibility examples:
# (3, 4) + ( 4) -> (3, 4) OK: 4==4, 1 implied
# (3, 4) + (3, 1) -> (3, 4) OK: 4 vs 1, 3==3
# (2, 3, 4) + (3, 4) -> (2, 3, 4) OK
# (3, 4) + (3, ) -> ERROR: 4 vs 3
import numpy as np
print(np.zeros((3,4)).shape) # (3, 4)
print((np.zeros((3,4)) + np.zeros(4)).shape) # (3, 4)브로드캐스팅에서 흔히 하는 실수
브로드캐스팅에서 가장 흔한 실수는 집계한 뒤 keepdims=True를 빠뜨려 형상이 맞지 않게 만드는 것입니다. 막히면 print(arr.shape)을 출력해 실제 상황을 확인하세요.
import numpy as np
m = np.arange(6).reshape(2, 3)
row_max = m.max(axis=1) # shape (2,) NOT (2,1)
print(row_max.shape) # (2,)
# m - row_max -> ERROR: shapes (2,3) and (2,) misalign
row_max_col = row_max[:, np.newaxis] # shape (2, 1)
print((m - row_max_col).shape) # (2, 3) OK빠른 확인
이 수업에서 배운 NumPy 브로드캐스팅 규칙에 대한 이해도를 확인해 보세요.
수업 요약
이제 이해하셨습니다! 브로드캐스팅은 크기가 1인 차원을 늘리고, 오른쪽부터 형상을 비교하며, keepdims=True는 축을 유지해 연산이 올바르게 맞도록 합니다. 다음 주제는 불리언 마스킹입니다.
자주 묻는 질문
“브로드캐스팅 규칙” 강의는 무료인가요?
네 — “브로드캐스팅 규칙” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“브로드캐스팅 규칙”에서 뭘 배우나요?
명시적으로 복제하지 않고 1차원 배열을 2차원 배열의 모든 행에 더할 수 있도록 NumPy의 브로드캐스팅 규칙을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“브로드캐스팅 규칙” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 범용 함수(ufunc)
- 집계 함수
- 브로드캐스팅 규칙
- 불리언 마스킹과 고급 인덱싱