2017-10-20 28 views
0

Je travaille avec la bibliothèque « scipy.signal » en Python et j'ai le code suivant:Erreur avec Padlen dans signal.filtfilt en Python

from scipy import signal 

b = [ 0.001016 0.00507999 0.01015998 0.01015998 0.00507999 0.001016 ] 

a = [ 1.   -3.0820186 4.04351697 -2.76126457 0.97291013 -0.14063199] 
data = [[ 1.] 
[ 1.] 
[ 1.] 
...] 
# length = 264 
y = signal.filtfilt(b, a, data) 

Mais quand j'exécute le code je reçois le message d'erreur suivant :

The length of the input vector x must be at least padlen, which is 18. 

Que pouvais-je faire?

Répondre

1

Il apparaît que data est un réseau bidimensionnel de forme (264, 1). Par défaut, filtfilt filtre le long du dernier axe du tableau d'entrée, donc dans votre cas, il essaie de filtrer le long d'un axe où la longueur des données est 1, ce qui n'est pas assez long pour la méthode de remplissage par défaut.

Je suppose que vous vouliez interpréter data comme un tableau unidimensionnel. Vous pouvez ajouter l'argument axis=0

y = signal.filtfilt(b, a, data, axis=0) 

pour filtrer le long de la première dimension (à savoir, en bas de la colonne), auquel cas la sortie y aura également une forme (264, 1). Vous pouvez également convertir l'entrée en un tableau unidimensionnel en l'aplatissant avec np.ravel(data) ou en utilisant l'indexation pour sélectionner la première (et la seule) colonne, data[:, 0]. (Ce dernier ne fonctionnera que si data est, en fait, un tableau numérique et non une liste de listes.) Par exemple.

y = signal.filtfilt(b, a, np.ravel(data)) 

Dans ce cas, la sortie y sera également un réseau à une dimension, avec une forme (264,).