Python에서 배열에 포함된 NaN(Not a Number) 값을 0으로 채우고, 양의 무한대(inf)와 음의 무한대(-inf)를 크거나 작은 유한 숫자로 변환해야 하는 경우가 자주 있습니다. 이럴 때 numpy.nan_to_num() 메서드를 사용하면 간단하게 처리할 수 있습니다.
numpy.nan_to_num() 메서드란?
numpy.nan_to_num()은 입력 배열 x에서 비유한(non-finite) 값들을 지정한 값으로 대체하여 반환합니다. copy 매개변수가 False로 설정되면 원본 배열 x 자체가 수정될 수도 있습니다.
주요 매개변수
- x: 처리할 입력 데이터입니다.
- copy: True이면 x의 복사본을 생성하고, False이면 제자리(in-place)에서 값을 교체합니다. 단, 제자리 연산은 배열로 캐스팅할 때 복사본이 필요 없는 경우에만 적용됩니다. 기본값은 True입니다.
- nan: NaN 값을 채우는 데 사용할 값입니다. 값을 지정하지 않으면 NaN은 0.0으로 대체됩니다.
- posinf: 양의 무한대 값을 채우는 데 사용할 값입니다. 값을 지정하지 않으면 매우 큰 유한 숫자로 대체됩니다.
- neginf: 음의 무한대 값을 채우는 데 사용할 값입니다. 값을 지정하지 않으면 매우 작은(음수) 유한 숫자로 대체됩니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
array() 메서드를 사용해 무한대와 NaN이 포함된 NumPy 배열을 생성합니다.
arr = np.array([np.inf, -np.inf, np.nan, -128, 128])
배열을 출력해 확인합니다.
print("Our Array...\n",arr)배열의 차원을 확인합니다.
print("\nDimensions of our Array...\n",arr.ndim)배열의 데이터 타입을 확인합니다.
print("\nDatatype of our Array object...\n",arr.dtype)배열의 형태(shape)를 확인합니다.
print("\nShape of our Array object...\n",arr.shape)이제 np.nan_to_num() 메서드를 사용해 NaN을 지정한 값으로 채우고, 무한대를 유한 숫자로 변환합니다. 아래 예제에서는 NaN을 11111로 대체했습니다.
print("\nResult...\n",np.nan_to_num(arr, nan = 11111))전체 예제 코드
import numpy as np
# array() 메서드로 NumPy 배열 생성
arr = np.array([np.inf, -np.inf, np.nan, -128, 128])
# 배열 출력
print("Our Array...\n",arr)
# 차원 확인
print("\nDimensions of our Array...\n",arr.ndim)
# 데이터 타입 확인
print("\nDatatype of our Array object...\n",arr.dtype)
# 형태(shape) 확인
print("\nShape of our Array object...\n",arr.shape)
# nan_to_num()으로 NaN을 11111로 채우고 무한대는 유한 숫자로 변환
print("\nResult...\n",np.nan_to_num(arr, nan = 11111))실행 결과
Our Array... [ inf -inf nan -128. 128.] Dimensions of our Array... 1 Datatype of our Array object... float64 Shape of our Array object... (5,) Result... [ 1.79769313e+308 -1.79769313e+308 1.11110000e+004 -1.28000000e+002 1.28000000e+002]
결과 해석
실행 결과를 보면 다음과 같이 변환된 것을 확인할 수 있습니다.
- inf(양의 무한대) → 1.79769313e+308: float64 타입이 표현할 수 있는 최댓값으로 대체되었습니다.
- -inf(음의 무한대) → -1.79769313e+308: float64 타입의 최솟값으로 대체되었습니다.
- nan → 11111: nan 매개변수로 지정한 값으로 채워졌습니다.
이처럼 numpy.nan_to_num()을 활용하면 데이터 분석이나 머신러닝 전처리 과정에서 비유한 값으로 인한 오류를 손쉽게 방지할 수 있습니다.