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 np
def f(x):
if np.absolute(x) > 0.5:
y = 0
else:
y = 1
return y
X = 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 plt
plt.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