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 |