반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- Apache
- hive
- Redshift
- PANDAS
- Mac
- Github
- django
- PySpark
- matplotlib
- Java
- Google Excel
- SQL
- Excel
- c#
- gas
- math
- GIT
- 파이썬
- Google Spreadsheet
- PostgreSQL
- Tkinter
- list
- Kotlin
- Python
- string
- dataframe
- numpy
- array
- google apps script
Archives
- Today
- Total
달나라 노트
Python numpy : nan_to_num 본문
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
반응형
'Python > Python numpy' 카테고리의 다른 글
| Python Pandas : stack, unstack (pivot하기, pivot 풀기) (0) | 2026.05.20 |
|---|---|
| Python numpy : sum, mean (0) | 2026.05.20 |
| Python numpy : minimum() / maximum() — 두 array를 element-wise로 비교해 작은/큰 값을 선택하는 메서드 (0) | 2026.05.14 |
| Python numpy : where() — 조건에 따라 두 값 중 하나를 선택하는 메서드 (0) | 2026.05.14 |
| Python numpy : polyfit() — 점들의 패턴에 가장 잘 맞는 다항식 계수를 추정하는 메서드 (0) | 2026.05.14 |
Comments
