[Numpy] 브로드캐스팅(broadcasting)과 벡터화(vectorization) 연산

2025. 5. 2. 09:20·python/Pandas | Numpy
728x90

Python 기본 리스트로 수치 계산을 하려면 보통 for문이 필요하다.
하지만 NumPy는 단순한 리스트가 아니라 배열(벡터) 연산이 가능한 구조로 되어 있어,


한 줄의 수식만으로도 대량의 데이터를 동시에 처리할 수 있다.

그 비결은 바로 벡터화(vectorization) 와 브로드캐스팅(broadcasting) 이다.

 

용어 설명
벡터화(vectorization) 반복문 없이 배열 전체에 연산 수행
브로드캐스팅(broadcasting) 서로 다른 shape의 배열 간 연산 시 자동 확장

벡터화 연산 기본

import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 20, 30])

a + b         # → array([11, 22, 33])
a * b         # → array([10, 40, 90])

- 요소 간 연산이 자동 적용됨 (Python의 list는 불가능)

 

스칼라와 벡터 연산

a = np.array([1, 2, 3])
a + 10        # → array([11, 12, 13])

- 모든 원소에 +10이 자동 적용됨
- 반복문 필요 없음

 

2차원 배열 브로드캐스팅 예시

a = np.array([[1, 2, 3],
              [4, 5, 6]])

b = np.array([10, 20, 30])

a + b

- b가 자동으로 각 행에 복제되어 연산됨

 

브로드캐스팅 규칙

NumPy는 아래 조건이 만족되면 자동 확장:

 

  • 두 배열의 차원 수가 다르면, 더 작은 쪽에 1을 추가
  • 각 축에 대해 두 값이 같거나, 한쪽이 1이면 OK
  • 그렇지 않으면 BroadcastingError 발생
# 예시

(2, 3) + (1, 3) → OK  
(2, 1) + (2, 3) → OK  
(3, ) + (3, 1) → ❌

 


열 단위 브로드캐스팅

a = np.array([[1], [2], [3]])   # (3, 1)
b = np.array([10, 20, 30])      # (3,)

a + b

(3, 1) vs (3,) → 불일치 → BroadcastingError 발생

 

해결 방법:

b = b.reshape((1, 3))  # 또는 np.newaxis 사용
a + b

 

 

1. 예제: 점수 일괄 가중치 적용

scores = np.array([
    [90, 80, 70],  # 학생 1
    [75, 85, 95],  # 학생 2
])

weights = np.array([0.3, 0.3, 0.4])  # 과목 가중치

final = np.sum(scores * weights, axis=1)
# → 각 학생별 가중 평균

 

 

2. 예제: 기준 벡터로 정규화

x = np.array([[1, 2, 3],
              [4, 5, 6]])

col_mean = x.mean(axis=0)  # 열별 평균
x_centered = x - col_mean  # 각 열에서 평균 빼기

 

 

브로드캐스팅과 벡터화 연산은 NumPy의 핵심이다.
for문을 대체하고, 몇 줄의 코드로 수천 수만 개의 데이터를 동시에 처리할 수 있게 해준다.

 
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'python > Pandas | Numpy' 카테고리의 다른 글

[Numpy] where, argmax, unique, argsort  (0) 2025.05.16
[Numpy] 슬라이싱, 마스킹, 조건 추출  (0) 2025.05.02
[Numpy] ndarray 구조 - 배열의 모양, 차원 ,타입  (0) 2025.05.02
[Numpy] percentile() - 백분위수 구하기  (0) 2025.05.02
[Pandas] clip() - 이상값 방어의 핵심  (0) 2025.05.02
'python/Pandas | Numpy' 카테고리의 다른 글
  • [Numpy] where, argmax, unique, argsort
  • [Numpy] 슬라이싱, 마스킹, 조건 추출
  • [Numpy] ndarray 구조 - 배열의 모양, 차원 ,타입
  • [Numpy] percentile() - 백분위수 구하기
Balang
Balang
음악 전공생의 개발일지
  • Balang
    Balang
    Balang
  • 전체
    오늘
    어제
  • 반응형
    • All Post (146)
      • python (45)
        • selenium (4)
        • algorithm (9)
        • Django (6)
        • Pandas | Numpy (22)
      • SQL (9)
      • Data Engineer (29)
      • Data Scientist (3)
      • Data Analysis (9)
      • Computer Science (35)
      • Why? (15)
      • 마음가짐 (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Balang
[Numpy] 브로드캐스팅(broadcasting)과 벡터화(vectorization) 연산
상단으로

티스토리툴바