IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Problème avec une fonction "recherche de pics"


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 20
    Points : 18
    Points
    18
    Par défaut Problème avec une fonction "recherche de pics"
    Bonjour à tous,
    J'aimerai un coup de main, je ne trouve pas la solution.
    J'ai une fonction qu'on ma réaliser en MATLAB qui fonctionnait très bien. Je l'ai transformé en python avec un peu d'aide et je rencontre des soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    # -*- coding: utf-8 -*-
     
    from matplotlib import pyplot as plt
    import numpy as np
    from pylab import *
     
    def search_peek(nbr_peek,signal,temps):
     
     
    	### INITIALISATION DES TABLEAUX ###
    	list_peek  =  np.zeros(nbr_peek)
    	list_index = np.zeros(nbr_peek)
     
    	### ORGANISATION DES POINTS ###
    	index_sort_increasing = argsort(signal)
    	index_sort_decreasing = np.flipud(index_sort_increasing)
     
    	### PREMIER PIC DETECTE ###
    	index1 = index_sort_decreasing[0]
    	list_peek[0]=index1
    	list_index[0]=signal[index1]
     
    	indice = 1	
    	n_peek =1
     
    	### ON RECHERCHE LES PICS ###
    	while(n_peek<nbr_peek):
    		index_temp=index_sort_decreasing[indice]
    		diff_gauche = signal[index_temp]-signal[index_temp-1],
    		diff_droite = signal[index_temp+1]-signal[index_temp];
     
    		if(diff_gauche>0) and (diff_droite<0):
    			list_peek[n_peek]= signal[index_temp]
    			list_index[n_peek] = index_temp
    			n_peek=n_peek+1;
    		indice = indice+1
     
    	return list_index,list_peek
     
     
    ### ESSAIS ###
    temps1 =np.array([1,2,3,4,5,6,7,8,9,10])
    signal1 = np.array([8,1,4,6,5,2,7,0,9,10])
     
    list_1,peek_1 = search_peek(1,temps1,signal1)
     
    plt.plot(temps1,signal1)
    plt.plot((list_1+1),peek_1,'r*')
    show()
    Ma fonction permet de chercher des PICS sur un signal et de me donner l'abscisse (signal provenant d'un CSV).
    Quand je recherche un pic, je n'ai pas d'erreur mais quand j'en cherche plusieurs, j'ai une erreur d'indice.
    Si vous voyez une erreur dans mon code..

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut.
    Les arguments utilisés lors de l'appel (signal et temps) sont inversés par rapport à ceux de la définition.
    A l'intérieur de la fonction, tu as confondu index_temp avec la valeur de la variable temps.
    Je me permets de donner ma version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def search_peak(t, s, nb_peak=1):
        i_max = len(s) - 1
        n = 0
        for i in np.argsort(-s):
            if i == i_max and s[i_max] > s[i_max - 1] \
            or i == 0 and s[0] > s[1] \
            or s[i] > s[i - 1] and s[i] > s[i + 1]:
                yield t[i], s[i]
                n += 1
                if n == nb_peak:
                    break

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup, j'essaye de suite !

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Je réponds au PO qui par MP demande comment faire pour récupérer la position des pics. On peut par exemple itérer avec une boucle for sur les valeurs retournées par la fonction search_peak.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import numpy as np
    import matplotlib.pyplot as plt
     
    def search_peak(t, s, nb_peak=1):
        i_max = len(s) - 1
        n = 0
        for i in np.argsort(-s):
            if i == i_max and s[i_max] > s[i_max - 1] \
            or i == 0 and s[0] > s[1] \
            or s[i] > s[i - 1] and s[i] > s[i + 1]:
                yield t[i], s[i]
                n += 1
                if n == nb_peak:
                    break
     
    if __name__ == '__main__':
        t = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
        s = np.array([800, 100, 400, 600, 500, 200, 700, 000, 900, 1000])
     
        for x, y in search_peak(t, s, 4):
            print('t={}\ts={}'.format(x, y))
     
        plt.plot(t, s)
        plt.scatter(*zip(*search_peak(t, s, 4)), marker='o', color='r')
        plt.show()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> 
    t=100	s=1000
    t=10	s=800
    t=70	s=700
    t=40	s=600
    >>>
    Ou pour obtenir les positions et valeurs avec zip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        posi, values = zip(*search_peak(t, s, 4))

Discussions similaires

  1. Problème avec une fonction
    Par mademoizel dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/06/2006, 10h51
  2. problème avec une fonction javaScript
    Par volthur dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/05/2006, 18h04
  3. Problème avec une fonction utilisateur !
    Par nalou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 17h06
  4. Problème avec une fonction et un array
    Par Neal Morse dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/08/2005, 12h04
  5. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo