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

Python NumPy convolve()로 두 1차원 배열의 이산 선형 컨볼루션 구하기 – 'valid' 모드 활용법

파이썬 NumPy에서 numpy.convolve() 메서드를 사용하면 두 개의 1차원 시퀀스(배열)에 대한 이산 선형 컨볼루션(discrete linear convolution)을 손쉽게 계산할 수 있습니다. 컨볼루션 연산자는 주로 신호 처리 분야에서 널리 사용되며, 선형 시불변 시스템(LTI)이 입력 신호에 미치는 영향을 수학적으로 모델링하는 데 활용됩니다. 또한 확률론에서는 서로 독립인 두 확률 변수의 합이 각각의 확률 분포를 컨볼루션한 분포를 따른다는 성질 때문에 이론적으로도 중요한 의미를 가집니다.

numpy.convolve() 메서드의 매개변수 이해하기

만약 v가 a보다 길다면, 연산을 수행하기 전에 두 배열이 자동으로 서로 교환(swap)됩니다. 이 메서드는 최종적으로 a와 v의 이산 선형 컨볼루션 결과를 반환합니다. 각 매개변수는 다음과 같습니다.

  • a : 첫 번째 1차원 입력 배열
  • v : 두 번째 1차원 입력 배열
  • mode (선택 사항) : 'full', 'valid', 'same' 세 가지 값 중 하나를 지정할 수 있습니다

특히 'valid' 모드는 max(M, N) − min(M, N) + 1 길이의 출력을 반환합니다. 이 모드에서는 두 신호가 완전히 겹치는 지점에 대해서만 컨볼루션 곱을 계산하며, 신호 경계 바깥의 값은 결과에 어떤 영향도 미치지 않습니다. 아래 예제에서는 이 'valid' 모드를 사용하여 겹치는 영역의 컨볼루션 결과를 구하는 과정을 살펴보겠습니다.

단계별 구현 방법

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

먼저 NumPy 라이브러리를 임포트합니다.

import numpy as np

2단계: array() 메서드로 1차원 배열 생성

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

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

3단계: 배열 내용 출력

생성된 두 배열을 화면에 출력해 확인합니다.

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

4단계: 배열의 차원 확인

ndim 속성으로 두 배열이 모두 1차원인지 검증합니다.

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

5단계: 배열의 형태(shape) 확인

shape 속성으로 각 배열의 크기를 확인합니다.

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

6단계: numpy.convolve()로 이산 선형 컨볼루션 계산

'valid' 모드를 지정하여 두 시퀀스의 이산 선형 컨볼루션을 반환받습니다.

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

전체 예제 코드

import numpy as np

# array() 메서드로 두 개의 NumPy 1차원 배열 생성
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() 메서드로 이산 선형 컨볼루션 계산 ('valid' 모드)
print("\nResult....\n", np.convolve(arr1, arr2, mode='valid'))

실행 결과

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....
[2.5]

실행 결과를 보면 두 배열의 길이가 모두 3이므로 'valid' 모드의 출력 길이는 max(3, 3) − min(3, 3) + 1 = 1이 됩니다. 따라서 두 신호가 완전히 겹치는 유일한 위치의 컨볼루션 값인 [2.5]만 반환되는 것을 확인할 수 있습니다.