파이썬에서 배열의 최솟값을 반환하거나 NaN(Not a Number) 값을 무시한 최솟값을 구하려면 numpy.nanmin() 메서드를 사용하면 됩니다. 이 메서드는 지정된 축이 제거된 형태로, 입력 배열과 같은 shape의 배열을 반환합니다. 만약 a가 0차원 배열이거나 axis가 None이면 ndarray 스칼라가 반환되며, 반환값의 dtype은 항상 원본 배열과 동일합니다.
일반적인 min() 함수와 달리 nanmin()은 배열 내에 NaN이 포함되어 있어도 이를 자동으로 건너뛰고 유효한 숫자들만 대상으로 최솟값을 계산한다는 점이 큰 장점입니다.
numpy.nanmin() 주요 매개변수
1. a — 입력 배열
첫 번째 매개변수인 a는 최솟값을 구하고자 하는 숫자들을 담고 있는 배열입니다. 배열이 아닌 값이 전달되더라도 자동으로 배열 변환을 시도합니다.
2. axis — 계산할 축
두 번째 매개변수인 axis는 최솟값을 계산할 축(또는 여러 개의 축)을 지정합니다. 기본값은 None이며, 이 경우 평탄화(flatten)된 배열 전체에 대한 최솟값 하나를 계산합니다.
3. out — 대체 출력 배열
세 번째 매개변수인 out은 결과를 저장할 별도의 출력 배열입니다. 기본값은 None이며, 값을 지정할 경우 예상되는 출력과 동일한 shape를 가져야 하고, 필요하다면 데이터 타입이 자동으로 캐스팅됩니다.
4. keepdims — 차원 유지 옵션
네 번째 매개변수인 keepdims를 True로 설정하면 축소된 축들이 크기 1짜리 차원으로 결과에 그대로 유지됩니다. 이 옵션을 사용하면 결과가 원본 배열 a와 올바르게 브로드캐스팅(broadcasting)됩니다. 기본값이 아닌 다른 값이 지정되면 keepdims는 ndarray 하위 클래스의 max 메서드에 전달되며, 해당 하위 클래스가 keepdims를 구현하지 않으면 예외가 발생합니다.
5. initial — 초기값
다섯 번째 매개변수는 출력 요소의 최대값 역할을 하는 초기값입니다. 빈 슬라이스(empty slice)에 대한 연산을 수행하려면 반드시 이 값을 제공해야 합니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
array() 메서드를 사용하여 NumPy 배열을 생성합니다. int 타입 요소와 함께 nan을 포함시켰습니다.
arr = np.array([[10, 20, 30], [40, np.nan, 60]])
생성된 배열을 화면에 출력합니다.
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...\n",arr.shape)
NaN을 무시하면서 각 축을 따라 최솟값을 구하려면 numpy.nanmin() 메서드를 호출합니다.
print("\nResult (nanmin)...\n",np.nanmin(arr, axis = 1))
전체 예제 코드
import numpy as np
# array() 메서드로 NumPy 배열 생성
# int 타입 요소와 함께 nan 추가
arr = np.array([[10, 20, 30], [40, np.nan, 60]])
# 배열 출력
print("Our Array...\n",arr)
# 차원 확인
print("\nDimensions of our Array...\n",arr.ndim)
# 데이터 타입 확인
print("\nDatatype of our Array object...\n",arr.dtype)
# numpy.nanmin()으로 NaN을 무시한 축별 최솟값 계산
print("\nResult (nanmin)...\n",np.nanmin(arr, axis = 1))
실행 결과
Our Array... [[10. 20. 30.] [40. nan 60.]] Dimensions of our Array... 2 Datatype of our Array object... float64 Result (nanmin)... [10. 40.]
결과 해석
axis=1로 설정했기 때문에 각 행(row)별로 최솟값이 계산되었습니다. 첫 번째 행 [10, 20, 30]의 최솟값은 10이며, 두 번째 행 [40, nan, 60]에서는 NaN이 무시되어 40이 반환되었습니다. 참고로 일반적인 np.min()을 사용했다면 NaN 전파(propagation) 특성 때문에 두 번째 행의 결과가 nan으로 나왔을 것입니다. 따라서 결측치(NaN)가 포함된 실전 데이터에서는 nanmin()을 사용하는 것이 안전합니다.