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

Python NumPy로 부호 없는 정수 배열의 n번째 이산 차이 계산하기

NumPy의 numpy.diff() 메서드를 사용하면 배열의 n번째 이산 차이(n-th discrete difference)를 손쉽게 계산할 수 있습니다. 첫 번째 차이는 지정된 축을 따라 out[i] = a[i+1] - a[i] 공식으로 구해지며, 더 높은 차수의 차이는 diff 함수를 재귀적으로 호출하여 계산됩니다.

numpy.diff()의 주요 매개변수

  • 첫 번째 매개변수(a): 차분을 수행할 입력 배열입니다.
  • 두 번째 매개변수(n): 차분을 반복하는 횟수입니다. 0을 지정하면 입력 배열이 그대로 반환됩니다.
  • 세 번째 매개변수(axis): 차이를 계산할 축입니다. 기본값은 마지막 축(-1)입니다.
  • 네 번째 매개변수(prepend / append): 차분을 수행하기 전에 해당 축을 따라 입력 배열 앞이나 뒤에 덧붙일 값입니다. 스칼라 값은 축 방향으로 길이 1인 배열로 확장되고, 나머지 모든 축에서는 입력 배열과 동일한 형태를 가집니다. 그 외의 경우에는 axis 축을 제외한 차원과 형태가 입력 배열과 일치해야 합니다.

부호 없는 정수 배열에서의 핵심 포인트

부호 없는 정수(unsigned integer) 배열에 대해 차분을 계산하면 결과 역시 부호 없는 정수로 반환됩니다. 따라서 원래 음수가 되어야 할 결과는 언더플로우로 인해 허용 범위의 최댓값으로 순환(wrap-around)됩니다. 예를 들어 uint8 타입에서 0 − 1은 255가 됩니다.

단계별 구현 방법

1단계: 필수 라이브러리 임포트

import numpy as np

2단계: 부호 없는 정수 배열 생성

array() 메서드를 사용하여 NumPy 배열을 생성합니다. 여기에는 부호 없는 타입의 요소를 담았으며, 부호 없는 정수 배열의 연산 결과 또한 부호 없는 정수로 나타납니다.

arr = np.array([1, 0], dtype=np.uint8)

3단계: 배열 출력

print("Our Array...\n", arr)

4단계: 배열의 차원 확인

print("\nDimensions of our Array...\n", arr.ndim)

5단계: 데이터 타입 확인

print("\nDatatype of our Array object...\n", arr.dtype)

6단계: 이산 차이 계산

numpy.diff() 메서드를 사용하여 n번째 이산 차이를 계산합니다.

print("\nDiscrete difference..\n", np.diff(arr))

전체 예제 코드

import numpy as np

# array() 메서드를 사용하여 NumPy 배열 생성
# 부호 없는 타입의 요소를 포함시켰습니다
# 부호 없는 정수 배열의 경우 결과도 부호 없는 정수가 됩니다.
arr = np.array([1, 0], dtype=np.uint8)

# 배열 출력
print("Our Array...\n", arr)

# 차원 확인
print("\nDimensions of our Array...\n", arr.ndim)

# 데이터 타입 확인
print("\nDatatype of our Array object...\n", arr.dtype)

# numpy.diff() 메서드로 n번째 이산 차이 계산
# 첫 번째 차이는 out[i] = a[i+1] - a[i]이며,
# 더 높은 차수의 차이는 diff를 재귀적으로 사용하여 계산됩니다.
print("\nDiscrete difference..\n", np.diff(arr))

실행 결과

Our Array...
[1 0]

Dimensions of our Array...
1

Datatype of our Array object...
uint8

Discrete difference..
[255]

결과 해석

생성된 배열은 [1 0]이며 1차원이고, 데이터 타입은 uint8(부호 없는 8비트 정수)입니다. 이산 차이 결과가 [255]로 나온 이유는 다음과 같습니다. 인접한 요소의 차이는 0 − 1 = −1이어야 하지만, uint8 타입은 0부터 255까지만 표현할 수 있어 −1이 최댓값인 255로 순환되기 때문입니다. 이처럼 부호 없는 정수 배열을 다룰 때는 차분 결과가 음수가 될 가능성이 있는지 항상 염두에 두어야 합니다.