달나라 노트

Python numpy : nan_to_num 본문

Python/Python numpy

Python numpy : nan_to_num

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

NumPy nan_to_num() — NaN과 무한대를 안전한 값으로 교체하는 함수

nan_to_num()은 배열에서 NaN, 양의 무한대(inf), 음의 무한대(-inf)를 지정한 값으로 교체하는 함수입니다. 수치 연산 전에 배열을 안전한 상태로 만들 때 씁니다.

기본 동작

np.nan_to_num(x)
# NaN  → 0
# inf  → 매우 큰 양수 (시스템 최댓값)
# -inf → 매우 큰 음수 (시스템 최솟값)

기본 문법

numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
파라미터 기본값 설명
nan 0.0 NaN 대체값
posinf 시스템 최댓값 양의 무한대 대체값
neginf 시스템 최솟값 음의 무한대 대체값
copy True False면 원본 직접 수정

작동 방식

기본 동작

import numpy as np

a = np.array([1.0, np.nan, np.inf, -np.inf, 5.0])

np.nan_to_num(a)
# array([ 1.00e+000,  0.00e+000,  1.80e+308, -1.80e+308,  5.00e+000])
#              ↑ NaN→0      ↑ inf→최댓값    ↑ -inf→최솟값

대체값 직접 지정

np.nan_to_num(a, nan=0, posinf=999, neginf=-999)
# array([  1.,   0., 999., -999.,   5.])

copy=False — 원본 직접 수정

a = np.array([1.0, np.nan, np.inf])

np.nan_to_num(a, copy=False)   # 원본 a가 바뀜
print(a)
# array([1., 0., 1.8e+308])

스칼라 입력

np.nan_to_num(np.nan)           # 0.0
np.nan_to_num(np.inf)           # 1.7976931348623157e+308
np.nan_to_num(-np.inf)          # -1.7976931348623157e+308

np.nan_to_num(np.nan, nan=-1)   # -1.0

inf는 언제 생기나?

np.log(0)                                      # -inf  ← 0의 로그
1 / np.array([0.0])                            # inf   ← 0으로 나누기
np.array([np.inf]) - np.array([np.inf])        # nan   ← inf - inf
이런 연산 결과를 그대로 두면 이후 모든 계산이 오염됩니다. nan_to_num으로 선제 처리합니다.

응용 사례 1 — 로그 변환 후 정제

data = np.array([0.0, 1.0, 10.0, 100.0])

log_data = np.log(data)
# array([-inf,  0.,  2.30,  4.60])   ← 0의 로그 = -inf

safe_log = np.nan_to_num(log_data, neginf=0)
# array([0., 0., 2.30, 4.60])

응용 사례 2 — 비율 계산 (0으로 나누기 방지)

a = np.array([10.0, 0.0, 30.0])
b = np.array([2.0,  0.0,  5.0])

# a/b → [5., nan, 6.]  (0/0=nan, x/0=inf 발생 가능)
ratio = np.nan_to_num(a / b, nan=0, posinf=0)
# array([5., 0., 6.])

응용 사례 3 — 머신러닝 피처 전처리

features = np.array([[1.0, np.nan, 3.0],
                     [np.inf, 5.0, -np.inf],
                     [7.0, 8.0, 9.0]])

clean = np.nan_to_num(features, nan=0, posinf=0, neginf=0)
# array([[1., 0., 3.],
#        [0., 5., 0.],
#        [7., 8., 9.]])

모델에 NaN이나 inf가 들어가면 학습이 망가지기 때문에 전처리 단계에서 반드시 처리합니다.


응용 사례 4 — 코사인 유사도 행렬 정제

# 벡터 크기가 0인 경우 코사인 유사도가 NaN이 될 수 있음
similarity = np.array([[1.0, np.nan, 0.8],
                       [np.nan, 1.0, 0.6],
                       [0.8, 0.6, 1.0]])

clean_sim = np.nan_to_num(similarity, nan=0.0)
# NaN 위치를 0(유사도 없음)으로 처리
# array([[1. , 0. , 0.8],
#        [0. , 1. , 0.6],
#        [0.8, 0.6, 1. ]])

nan_to_num vs pandas fillna

import pandas as pd

s = pd.Series([1.0, np.nan, np.inf])

s.fillna(0)
# 0    1.0
# 1    0.0
# 2    inf   ← inf는 처리 안 됨

np.nan_to_num(s.values, nan=0, posinf=0)
# array([1., 0., 0.])   ← NaN + inf 모두 처리
nan_to_num pandas fillna
NaN 처리 O O
inf 처리 O X
대상 NumPy 배열 pandas Series / DataFrame
핵심 직관: nan_to_num은 배열을 수치 연산에 "안전한 상태"로 만드는 안전망입니다. 로그·나눗셈 등 inf가 생길 수 있는 연산 직후, 또는 모델 입력 직전에 씁니다.
728x90
반응형
Comments