Python에서 NaN(Not a Number)을 0으로, 무한대(infinity)를 큰 유한 숫자로 대체하려면 numpy.nan_to_num() 메서드를 사용하면 됩니다. 이 메서드는 입력 배열 x에서 비유한(non-finite) 값들을 대체한 결과를 반환하며, copy=False로 설정한 경우 x 자체가 반환될 수도 있습니다.
nan_to_num()의 주요 매개변수
첫 번째 매개변수(x): 처리할 입력 데이터입니다.
두 번째 매개변수(copy): x의 복사본을 생성할지(True) 아니면 제자리(in-place)에서 값을 교체할지(False)를 결정합니다. 제자리 연산은 배열로 캐스팅할 때 복사본이 필요하지 않은 경우에만 수행됩니다. 기본값은 True입니다.
세 번째 매개변수(nan): NaN 값을 채우는 데 사용할 값입니다. 값을 전달하지 않으면 NaN은 기본적으로 0.0으로 대체됩니다.
네 번째 매개변수(posinf): 양의 무한대(+inf) 값을 채우는 데 사용할 값입니다. 값을 전달하지 않으면 매우 큰 유한 숫자로 대체됩니다.
다섯 번째 매개변수(neginf): 음의 무한대(-inf) 값을 채우는 데 사용할 값입니다. 값을 전달하지 않으면 매우 작은(음의) 숫자로 대체됩니다.
단계별 구현 방법
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
array() 메서드를 사용해 복소수와 NaN을 포함하는 numpy 배열을 생성합니다.
arr = np.array([complex(np.inf, np.nan), np.nan])
생성된 배열을 출력해 확인합니다.
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)이제 numpy.nan_to_num() 메서드를 사용해 NaN을 지정한 값으로, 무한대를 큰 유한 숫자로 대체합니다.
print("\nResult...\n",np.nan_to_num(arr, nan = 11111))전체 예제 코드
import numpy as np
# array() 메서드를 사용해 numpy 배열 생성
arr = np.array([complex(np.inf, np.nan), np.nan])
# 배열 출력
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+nanj nan +0.j] Dimensions of our Array... 1 Datatype of our Array object... complex128 Shape of our Array object... (2,) Result... [1.79769313e+308+11111.j 1.11110000e+004 +0.j]
결과 해석
위 예제에서 원래 배열은 complex128 타입의 1차원 배열로, 양의 무한대(inf)와 NaN이 포함된 복소수 요소를 가지고 있습니다. nan_to_num() 메서드에 nan=11111 옵션을 적용한 결과는 다음과 같습니다.
- 실수부의 양의 무한대(inf)는 float64가 표현할 수 있는 최댓값인 약 1.79769313e+308로 대체되었습니다.
- NaN 값은 지정한 11111로 채워졌습니다.
이처럼 nan_to_num()은 수치 계산 과정에서 발생할 수 있는 비유한 값들을 안전하게 처리해야 할 때 매우 유용합니다. 특히 머신러닝 전처리나 대규모 수치 연산에서 오류를 방지하는 데 널리 활용됩니다.