달나라 노트

Python numpy : sum, mean 본문

Python/Python numpy

Python numpy : sum, mean

CosmosProject 2026. 5. 20. 21:30
728x90
반응형

NumPy sum() / mean() — 합계와 평균을 axis 방향으로 계산하는 메서드

배열 전체 또는 특정 축(axis) 방향으로 합계와 평균을 구합니다. axis 개념만 이해하면 행/열 단위 집계가 자유로워집니다.

axis 개념 이해

NumPy 연산의 핵심은 axis입니다. axis=0은 행을 따라 아래 방향(↓)으로, axis=1은 열을 따라 가로 방향(→)으로 연산합니다.

2D array:
        col0  col1  col2
row0  [[ 1,    2,    3 ],
row1   [ 4,    5,    6 ],
row2   [ 7,    8,    9 ]]

axis=0 → 행 방향(↓): 각 열을 따라 내려가며 연산 → 결과는 열마다 1개
axis=1 → 열 방향(→): 각 행을 따라 가로로 연산  → 결과는 행마다 1개

기본 문법

numpy.sum(a, axis=None, keepdims=False)
numpy.mean(a, axis=None, keepdims=False)

np.sum() 작동 방식

import numpy as np

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

np.sum(a)           # 45  ← 전체 합계
np.sum(a, axis=0)   # array([12, 15, 18])  ← 열별 합계 (1+4+7, 2+5+8, 3+6+9)
np.sum(a, axis=1)   # array([ 6, 15, 24])  ← 행별 합계 (1+2+3, 4+5+6, 7+8+9)

np.mean() 작동 방식

np.mean(a)          # 5.0  ← 전체 평균
np.mean(a, axis=0)  # array([4., 5., 6.])  ← 열별 평균
np.mean(a, axis=1)  # array([2., 5., 8.])  ← 행별 평균
주의: mean()은 항상 float을 반환합니다. sum()은 입력 배열의 dtype을 그대로 따릅니다.

keepdims 옵션 — shape 유지

연산 후에도 원본과 같은 차원 수를 유지합니다. 브로드캐스팅과 함께 쓸 때 유용합니다.

np.sum(a, axis=1)
# array([ 6, 15, 24])  ← shape (3,)  1차원으로 축소됨

np.sum(a, axis=1, keepdims=True)
# array([[ 6],         ← shape (3, 1)  2차원 유지
#        [15],
#        [24]])

응용 사례 1 — 학생 성적 처리

# shape: (학생수, 과목수)
scores = np.array([[85, 90, 78],
                   [70, 65, 88],
                   [92, 88, 95]])

student_avg = np.mean(scores, axis=1)  # 학생별 평균 → [84.3, 74.3, 91.7]
subject_avg = np.mean(scores, axis=0)  # 과목별 평균 → [82.3, 81.0, 87.0]
total       = np.sum(scores)           # 전체 합계   → 751

응용 사례 2 — 이미지 흑백 변환

# RGB 이미지: shape (H, W, 3)
img_rgb = np.random.randint(0, 256, (100, 100, 3))

gray = np.mean(img_rgb, axis=2)  # R, G, B 평균 → shape (100, 100)

응용 사례 3 — 정규화 (Mean Centering)

각 feature(열)의 평균을 빼서 데이터를 중앙 정렬합니다. 이때 keepdims 없이도 브로드캐스팅이 자동 적용됩니다.

data = np.array([[10, 20, 30],
                 [40, 50, 60]])

col_mean = np.mean(data, axis=0)   # [25., 35., 45.]
centered = data - col_mean         # 브로드캐스팅 자동 적용
# array([[-15., -15., -15.],
#        [ 15.,  15.,  15.]])

NaN 처리 — np.nansum() / np.nanmean()

기본 sum() / mean()은 NaN이 하나라도 있으면 결과가 NaN이 됩니다. nan 버전은 NaN을 무시하고 계산합니다.

data = np.array([1.0, 2.0, np.nan, 4.0])

np.sum(data)      # nan   ← NaN 전파
np.nansum(data)   # 7.0   ← NaN 무시

np.mean(data)     # nan   ← NaN 전파
np.nanmean(data)  # 2.33  ← NaN 무시 (1+2+4) / 3

핵심 요약

np.sum() np.mean()
반환값 합계 평균 (항상 float)
axis 없음 전체 합산 전체 평균
axis=0 열 방향 합산 (↓) 열 방향 평균 (↓)
axis=1 행 방향 합산 (→) 행 방향 평균 (→)
NaN 처리 np.nansum() np.nanmean()
핵심 직관: axis는 "이 방향을 따라서 연산한다"는 뜻입니다. axis=0은 행을 따라 내려가며(→ 열별 결과), axis=1은 열을 따라 옆으로 가며(→ 행별 결과) 계산합니다.
728x90
반응형
Comments