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

Python NumPy convolve()로 두 1차원 배열의 이산 선형 컨볼루션 계산하기

Python Numpy에서 numpy.convolve() 메서드를 사용하면 두 개의 1차원 시퀀스(배열)에 대한 이산 선형 컨볼루션(discrete linear convolution)을 손쉽게 계산할 수 있습니다. 컨볼루션 연산자는 신호 처리 분야에서 자주 등장하며, 선형 시불변(linear time-invariant) 시스템이 신호에 미치는 영향을 모델링하는 데 활용됩니다. 또한 확률론에서는 두 독립 확률 변수의 합이 각각의 분포를 컨볼루션한 분포를 따른다는 사실로도 잘 알려져 있습니다. 참고로 v가 a보다 길다면, 계산 전에 두 배열이 자동으로 교환됩니다.

numpy.convolve() 메서드는 a와 v의 이산 선형 컨볼루션 결과를 반환합니다. 첫 번째 매개변수 a(N,)는 첫 번째 1차원 입력 배열이고, 두 번째 매개변수 v(M,)는 두 번째 1차원 입력 배열입니다. 세 번째 매개변수 mode는 선택 사항으로 'full', 'valid', 'same' 중 하나의 값을 지정할 수 있습니다.

  • 'full'(기본값): 겹침이 발생하는 모든 지점에서의 컨볼루션 값을 반환하며, 출력 형태는 (N+M-1,)입니다. 컨볼루션의 끝점에서는 신호가 완전히 겹치지 않기 때문에 경계 효과(boundary effect)가 나타날 수 있습니다.
  • 'valid': max(M, N) - min(M, N) + 1 길이의 출력을 반환합니다. 신호가 완전히 겹치는 지점에 대해서만 컨볼루션 곱이 계산되며, 신호 경계 밖의 값은 결과에 영향을 주지 않습니다.
  • 'same': 입력 중 더 긴 배열과 같은 길이인 max(M, N) 크기의 출력을 반환합니다.

단계별 진행 과정

먼저 필요한 라이브러리를 임포트합니다.

import numpy as np

array() 메서드를 사용하여 두 개의 1차원 NumPy 배열을 생성합니다.

arr1 = np.array([1, 2, 3])
arr2 = np.array([0, 1, 0.5])

생성한 배열을 화면에 출력합니다.

print("Array1...\n",arr1)
print("\nArray2...\n",arr2)

두 배열의 차원(ndim)을 확인합니다.

print("\nDimensions of Array1...\n",arr1.ndim)
print("\nDimensions of Array2...\n",arr2.ndim)

두 배열의 형태(shape)를 확인합니다.

print("\nShape of Array1...\n",arr1.shape)
print("\nShape of Array2...\n",arr2.shape)

numpy.convolve() 메서드를 사용하여 두 1차원 시퀀스의 이산 선형 컨볼루션을 계산합니다.

print("\nResult....\n",np.convolve(arr1, arr2, mode = 'full'))

전체 예제 코드

import numpy as np

# array() 메서드로 두 개의 1차원 NumPy 배열 생성
arr1 = np.array([1, 2, 3])
arr2 = np.array([0, 1, 0.5])

# 배열 출력
print("Array1...\n",arr1)
print("\nArray2...\n",arr2)

# 두 배열의 차원 확인
print("\nDimensions of Array1...\n",arr1.ndim)
print("\nDimensions of Array2...\n",arr2.ndim)

# 두 배열의 형태 확인
print("\nShape of Array1...\n",arr1.shape)
print("\nShape of Array2...\n",arr2.shape)

# numpy.convolve()로 이산 선형 컨볼루션 계산
print("\nResult....\n",np.convolve(arr1, arr2, mode = 'full'))

실행 결과

Array1...
[1 2 3]

Array2...
[0. 1. 0.5]

Dimensions of Array1...
1

Dimensions of Array2...
1

Shape of Array1...
(3,)

Shape of Array2...
(3,)

Result....
[0. 1. 2.5 4. 1.5]