주어진 축을 따라 배열 요소의 누적 곱(cumulative product)을 계산하면서 NaN(Not a Number)은 1로 취급하고 싶다면 numpy.nancumprod() 메서드를 사용하면 됩니다.
이 메서드의 특징은 다음과 같습니다.
- 누적 곱 계산 중 NaN을 만나도 결과가 변하지 않으며(NaN이 1처럼 취급됨)
- 배열 맨 앞에 있는 선행 NaN들은 1로 대체됩니다.
- 모든 요소가 NaN이거나 비어 있는 슬라이스에는 1을 반환합니다.
- 결과는 새로운 배열로 반환되며,
out매개변수를 지정한 경우 해당 배열에 결과가 저장되어 반환됩니다.
누적 곱의 동작 방식
누적 곱은 다음과 같이 이전 결과에 현재 값을 곱해 나가는 방식입니다.
예: 5, 5×10, 5×10×15, 5×10×15×20
nancumprod()의 매개변수
- 1번째 매개변수(a): 입력 배열입니다.
- 2번째 매개변수(axis): 누적 곱을 계산할 축입니다. 기본값은 None이며, 이 경우 입력 배열이 1차원으로 평탄화(flatten)된 후 계산됩니다.
- 3번째 매개변수(dtype): 반환 배열과 곱셈 과정에서 사용될 누산기(accumulator)의 데이터 타입입니다. dtype을 지정하지 않으면 기본적으로 입력 배열 a의 dtype을 사용하지만, a의 정수 타입 정밀도가 플랫폼 기본 정수보다 낮은 경우에는 플랫폼 기본 정수 타입이 사용됩니다.
- 4번째 매개변수(out): 결과를 저장할 대체 출력 배열입니다. 예상 출력과 동일한 shape와 버퍼 길이를 가져야 하며, 필요 시 값의 타입은 자동으로 변환(cast)됩니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
array() 메서드를 사용하여 numpy 배열을 생성합니다. 정수형 요소와 함께 nan 값을 포함시켰습니다.
arr = np.array([[5, 10, 15], [20, np.nan, 30]])
배열을 출력해 확인합니다.
print("Our Array...\n",arr)배열의 차원을 확인합니다.
print("\nDimensions of our Array...\n",arr.ndim)배열의 데이터 타입을 확인합니다.
print("\nDatatype of our Array object...\n",arr.dtype)NaN을 1로 취급하며 주어진 축(axis=1, 즉 각 행을 따라)을 따라 누적 곱을 계산하기 위해 nancumprod() 메서드를 사용합니다. NaN을 만나도 누적 곱 값은 그대로 유지됩니다.
print("\nCumulative Product of array elements...\n",np.nancumprod(arr, axis = 1))전체 예제 코드
import numpy as np
# array() 메서드를 사용하여 numpy 배열 생성
# 정수형 요소와 함께 nan 값을 포함
arr = np.array([[5, 10, 15], [20, np.nan, 30]])
# 배열 출력
print("Our Array...\n",arr)
# 차원 확인
print("\nDimensions of our Array...\n",arr.ndim)
# 데이터 타입 확인
print("\nDatatype of our Array object...\n",arr.dtype)
# nancumprod() 메서드로 NaN을 1로 취급하며 누적 곱 계산
# NaN을 만나도 누적 곱은 변하지 않음
print("\nCumulative Product of array elements...\n",np.nancumprod(arr, axis = 1))실행 결과
Our Array... [[ 5. 10. 15.] [20. nan 30.]] Dimensions of our Array... 2 Datatype of our Array object... float64 Cumulative Product of array elements... [[ 5. 50. 750.] [ 20. 20. 600.]]
출력 결과를 보면 두 번째 행의 NaN 위치에서 누적 곱이 변경되지 않은 것을 확인할 수 있습니다. 즉, 20 × NaN(=1)은 여전히 20이 되고, 다음 요소인 30을 곱해 600이 됩니다. 일반적인 cumprod() 함수였다면 NaN 이후의 모든 값이 NaN으로 전파되었겠지만, nancumprod()는 NaN을 건너뛰어 실무적으로 훨씬 유용하게 활용할 수 있습니다.