Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

NumPy nancumprod()로 NaN을 1로 취급하는 배열 요소의 누적 곱 계산하기

주어진 축을 따라 배열 요소의 누적 곱(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을 건너뛰어 실무적으로 훨씬 유용하게 활용할 수 있습니다.