HOWTO · Python

Trouver des pics en Python

Ce didacticiel présente les algorithmes de recherche de pics en Python.

Sur cette page

Un maximum local est un échantillon supérieur aux échantillons voisins ; il n’a pas besoin d’être la valeur la plus élevée de toute la série. Pour une séquence unidimensionnelle, comparez chaque valeur intérieure à ses voisines pour obtenir un résultat simple, ou utilisez scipy.signal.find_peaks() si vous devez filtrer les candidats. Ces fonctions renvoient des indices à base zéro dans les données d’origine ; utilisez-les donc pour retrouver les valeurs des pics.

Utiliser NumPy pour trouver de simples maxima locaux

Cet exemple compact utilise un tableau unidimensionnel et affiche chaque indice détecté avec sa valeur.

import numpy as np

data = np.array([1, 3, 7, 1, 2, 6, 0, 5, 0, 4])
local_maxima = (data[1:-1] > data[:-2]) & (data[1:-1] > data[2:])
indices = np.flatnonzero(local_maxima) + 1
print("indices:", indices.tolist())
print("values:", data[indices].tolist())
indices: [2, 5, 7]
values: [7, 6, 5]

Les deux comparaisons exigent qu’un échantillon soit strictement supérieur à ses deux voisins immédiats. Le découpage ne compare que les échantillons intérieurs : le premier et le dernier élément ne sont donc pas candidats, et les plateaux de valeurs égales sont également exclus. Le décalage d’indice permet de faire correspondre le tableau de comparaison, plus court, aux positions dans data. Cette méthode NumPy convient lorsque cette règle précise correspond à vos données. Pour cette entrée, les indices détectés sont [2, 5, 7] et les valeurs correspondantes sont [7, 6, 5].

Utiliser scipy.signal.find_peaks() pour filtrer les pics

Pour rechercher des pics dans une séquence unidimensionnelle générale, la fonction scipy.signal.find_peaks() de SciPy renvoie les indices des maxima locaux et peut appliquer des conditions facultatives. L’exemple suivant sélectionne les pics dont la hauteur est d’au moins 3, puis affiche leurs indices et leurs valeurs :

import numpy as np
from scipy.signal import find_peaks

data = np.array([1, 3, 7, 1, 2, 6, 0, 5, 0, 4])
indices, properties = find_peaks(data, height=3, distance=2, prominence=1)
print("indices:", indices.tolist())
print("values:", data[indices].tolist())
indices: [2, 5, 7]
values: [7, 6, 5]

height filtre les pics selon leur valeur, distance impose un espacement minimal entre les pics conservés, exprimé en nombre d’échantillons, et prominence mesure à quel point un pic se détache de son environnement. distance influe sur les pics conservés ; cette propriété n’est pas renvoyée. Parmi les autres conditions facultatives figurent width et threshold. SciPy renvoie les indices ainsi qu’un dictionnaire de propriétés contenant celles qui sont calculées pour les conditions applicables demandées. Pour cette entrée et ces arguments, les indices renvoyés sont [2, 5, 7], avec les valeurs [7, 6, 5]. Choisissez des conditions adaptées au signal au lieu de supposer que chaque maximum local est pertinent.

Utiliser scipy.signal.argrelextrema() pour trouver des extrema relatifs

Utilisez scipy.signal.argrelextrema() pour comparer des échantillons dans un voisinage défini. Passez un comparateur tel que np.greater pour trouver les maxima et définissez order comme le nombre d’échantillons pris en compte de chaque côté de la comparaison. Le résultat est un tuple de tableaux d’indices, un par dimension de l’entrée ; pour un tableau unidimensionnel, accédez aux indices avec [0].

import numpy as np
from scipy.signal import argrelextrema

data = np.array([1, 3, 7, 1, 2, 6, 0, 5, 0, 4])
indices = argrelextrema(data, np.greater, order=1)[0]
print("indices:", indices.tolist())
print("values:", data[indices].tolist())
indices: [2, 5, 7]
values: [7, 6, 5]

Avec order=1, chaque candidat est comparé à un échantillon de chaque côté. Une valeur plus élevée élargit le voisinage et peut produire un ensemble différent d’extrema relatifs. Pour cette entrée avec order=1, les indices renvoyés sont [2, 5, 7] et leurs valeurs sont [7, 6, 5].

Utiliser detecta.detect_peaks() comme solution de remplacement

detecta.detect_peaks() est une solution tierce pour une séquence unidimensionnelle. Installez cette dépendance dans l’environnement de votre projet avec python -m pip install detecta, puis transmettez les données d’exemple à detect_peaks() :

data = [1, 3, 7, 1, 2, 6, 0, 5, 0, 4]
try:
    from detecta import detect_peaks
except ImportError:
    print("Install detecta with: python -m pip install detecta")
else:
    indices = detect_peaks(data)
    values = [data[index] for index in indices]
    print("indices:", list(indices))
    print("values:", values)

Pour la séquence d’exemple, les indices de pic attendus, à base zéro, sont [2, 5, 7], ce qui correspond aux valeurs [7, 6, 5]. Les éléments d’exécution fournis ne confirment que le message indiquant que la dépendance est absente ; ce résultat de detecta est donc une comparaison attendue, et non une sortie observée à l’exécution. Conservez le contrôle de l’importation : si detecta n’est pas disponible, le code affiche la commande d’installation au lieu de tenter la détection.

Choisir une méthode de détection des pics

Utilisez la comparaison NumPy si la règle recherchée consiste uniquement à trouver les maxima stricts par rapport aux voisins immédiats et si vous souhaitez voir directement comment elle fonctionne. Choisissez scipy.signal.find_peaks() lorsque vous devez filtrer les pics selon des conditions comme la hauteur, l’espacement, la proéminence ou la largeur. Utilisez scipy.signal.argrelextrema() lorsque le voisinage de comparaison et le comparateur sont au cœur de votre définition d’un extremum. Envisagez detecta.detect_peaks() si son API tierce convient à votre projet et que vous acceptez d’ajouter cette dépendance.

Toutes les positions renvoyées sont des indices à base zéro dans la séquence d’entrée. Avant d’interpréter le résultat, comparez la définition de la méthode à vos données : le traitement des extrémités, des plateaux et des conditions de filtrage varie. Les exemples ci-dessus portent sur les maxima locaux dans des données numériques unidimensionnelles ; la détection de pics multidimensionnels nécessite une méthode conçue pour cette forme de données.