Exemples de comment effectuer une convolution 1D en python ?
voir aussi how to convolve two 2-dimensional matrices in python with scipy
Convolution 1D en python
Considérons les données suivantes :
F = [1, 2, 3]G = [0, 1, 0.5]
Pour calculer la convolution 1d entre F et G : F*G, une solution est d'utiliser numpy.convolve:
C = np.convolve(F,G)
donnera ici
array([0. , 1. , 2.5, 4. , 1.5])
Brève explication sur la façon d'obtenir le résultat ci-dessus. D'abord le noyau G est inversé [0, 1, 0.5] -> [0.5, 1, 0.]
(Étape 1) Calculer C[0] => 0.
| f | g | product |
|---|---|---|
| - | 0.5 | - |
| - | 1 | - |
| 1 | 0 | 0 |
| 2 | 0 | 0 |
| 3 | 0 | 0 |
$$\sum product = 0$$
(Étape 2) Calculer C[1] => 1.0
| f | g | product |
|---|---|---|
| - | 0.5 | - |
| 1 | 1 | 1 |
| 2 | 0 | 0 |
| 3 | 0 | 0 |
$$\sum product = 1$$
(Étape 3) Calculer C[2] => 2.5
| f | g | product |
|---|---|---|
| 1 | 0.5 | 0.5 |
| 2 | 1 | 2 |
| 3 | 0 | 0 |
$$\sum product = 0.5 + 2 = 2.5$$
(Étape 4) Calculer C[3] = 4.
| f | g | product |
|---|---|---|
| 1 | 0 | 0 |
| 2 | 0.5 | 1 |
| 3 | 1.0 | 3 |
| - | 0.0 | - |
$$\sum product = 1 + 3 = 4$$
(Étape 5) Calculer C[4] = 1.5
| f | g | product |
|---|---|---|
| 1 | - | 0 |
| 2 | 0 | 0 |
| 3 | 0.5 | 1.5 |
| - | 1.0 | - |
$$\sum product = 1.5$$
Convolution 1D en utilisant l'option "same"
Pour avoir en sortie une variable de même taille que l'entrée F :
np.convolve(F,G,'same')
donne
array([1. , 2.5, 4. ])
Convolution 1D en utilisant l'option "valid"
np.convolve(F,G,'valid')
donne
array([2.5])
Calcule uniquement :
| f | g | product |
|---|---|---|
| 1 | 0.5 | 0.5 |
| 2 | 1 | 2 |
| 3 | 0 | 0 |
$$\sum product = 0.5 + 2 = 2.5$$
Un autre example
Un autre exemple, créons une fonction rectangulaire en python (voir aussi l'article de wikipedia Convolution)
import numpy as npdef f(x):if np.absolute(x) > 0.5:y = 0else:y = 1return yX = np.linspace(-2.0, 2.0, num=100)F = [f(x) for x in X]
Et calculons par exemple l'autocorrélation
G = [f(x) for x in X]C = np.convolve(F, G)
Pour visualiser les résultats, nous pouvons d'abord tracer la fonction rectangulaire à l'aide de matplotlib :
import matplotlib.pyplot as pltplt.plot(X,F)plt.title("How to perform a 1D convolution in python ?")plt.savefig("1d_convolution_01.png", bbox_inches='tight', dpi=100)plt.show()
donne

and then plot the autocorrelation:
plt.plot(C)plt.title("How to perform a 1D convolution in python ?")plt.savefig("1d_convolution_02.png", bbox_inches='tight', dpi=100)plt.show()
donne

