HOWTO · NumPy
NumPy 배열에서 Nan 값 제거
Python의 NumPy 배열에서 nan 값을 제거하는 방법 알아보기
이 페이지의 내용
NumPy 배열에서 NaN 요소를 제거하려면 NaN이 아닌 값에 대해 참인 마스크를 만든 다음, 그 마스크로 요소를 선택하면 됩니다. NumPy 배열에서는 array[~np.isnan(array)]가 간결한 표현입니다.
NumPy에서 logical_not() 및 isnan() 함수로 NaN 값 제거
np.isnan(array)는 요소가 NaN인 위치에서 True인 불리언 배열을 반환합니다. np.logical_not()은 이 값을 반전하므로 일반 숫자에 대해 True인 마스크가 만들어집니다. 불리언 인덱싱은 조건에 맞는 요소를 원래 순서대로 선택합니다. NumPy 불리언 배열에서는 ~ 연산자를 사용해 같은 결과를 더 짧게 표현할 수 있습니다.
다음 예제는 두 표현을 모두 적용하고, 입력에 NaN만 있거나 NaN이 전혀 없을 때의 결과도 보여 줍니다.
import numpy as np
values = np.array([1.0, np.nan, 3.0])
without_nan = values[np.logical_not(np.isnan(values))]
without_nan_short = values[~np.isnan(values)]
all_nan = np.array([np.nan, np.nan])
no_nan = np.array([1, 2, 3])
print(without_nan)
print(without_nan_short)
print(all_nan[~np.isnan(all_nan)])
print(no_nan[~np.isnan(no_nan)])
[1. 3.]
[1. 3.]
[]
[1 2 3]
두 마스크는 같은 필터링 결과를 만듭니다. 모든 요소가 NaN인 배열에서는 요소가 없는 배열이 반환되고, NaN이 없는 입력은 그대로 반환됩니다. 자세한 내용은 np.logical_not() 공식 문서와 np.isnan() 공식 문서를 참조하세요.
NumPy에서 isfinite() 함수로 NaN 값 제거
np.isfinite(array)는 유한한 숫자에 대해 참인 마스크를 만듭니다. 이 마스크로 인덱싱하면 NaN이 제거되지만 양의 무한대와 음의 무한대도 함께 제거됩니다. 유한한 값만 필요할 때 이 함수를 사용하세요. 무한대는 유지하면서 NaN만 제거하려면 앞에서 설명한 np.isnan() 반전 마스크를 사용하면 됩니다. 숫자형에서의 동작은 np.isfinite() 공식 문서에서 확인할 수 있습니다.
math.isnan() 함수로 NaN 값 제거
Python 표준 라이브러리의 math.isnan()은 한 번에 스칼라 값 하나를 검사합니다. 먼저 import math로 가져옵니다. 1차원 숫자 배열에서는 리스트 컴프리헨션으로 불리언 마스크를 만들 수 있습니다. keep = [not math.isnan(value) for value in values]로 마스크를 만든 다음 filtered = values[keep]를 사용합니다. 이 방식은 Python에서 배열의 각 요소를 순회하지만, NumPy 함수는 배열에 대해 연산합니다. 이 예제는 1차원 입력을 전제로 합니다. 다차원 배열을 순회하면 스칼라 숫자가 아니라 하위 배열이 나오기 때문입니다.
pandas.isnull() 함수로 NaN 값 제거
프로젝트에서 이미 pandas를 사용한다면 import pandas as pd로 가져온 뒤 pd.isnull()로 결측값을 찾고, 반전한 마스크를 사용할 수 있습니다. filtered = values[~pd.isnull(values)]와 같이 작성합니다. 이는 NumPy 메서드가 아니라 pandas 함수이며, 이 작업만을 위해 pandas를 새로 설치할 필요는 없습니다. 지원되는 자료 구조에 다른 pandas 결측값 표식이 들어 있는 경우에도 이 함수가 이를 감지합니다. 기존 pandas isnull() 참조 문서도 참고하세요.