Aller au contenu

Écrêtage des valeurs d'un tableau⚓︎

L'écrêtage d'un signal consiste à limiter l'amplitude du signal entre deux valeurs x_min et x_max. On peut également appliquer cela aux valeurs d'un tableau. Voici par exemple un tableau valeurs que l'on a écrêté entre \(-150\) et \(150\) pour donner le tableau valeurs_ecretees :

🐍 Script Python
valeurs          = [34, 56, 89, 134, 152, 250, 87, -34, -187, -310]
valeurs_ecretees = [34, 56, 89, 134, 150, 150, 87, -34, -150, -150]

Question 1⚓︎

Compléter une fonction limite_amplitude qui prend en paramètre un nombre x ainsi que deux nombres x_min et x_max avec x_min <= x_max et qui renvoie :

  • x si x est compris entre x_min et x_max,
  • x_min si x est plus petit que x_min,
  • x_max si x est plus grand que x_max.
Exemple
🐍 Console Python
>>> limite_amplitude(34, -150, 150)
34
>>> limite_amplitude(-187, -150, 150)
-150

Question 2⚓︎

Compléter la fonction ecrete ci-dessous qui prend en paramètre un tableau de valeurs ainsi que x_min et x_max avec x_min <= x_max et renvoie un tableau des valeurs écrêtées entre x_min et x_max.

Exemple
🐍 Console Python
>>> valeurs = [34, 56, 89, 134, 152, 250, 87, -34, -187, -310]
>>> ecrete(valeurs, -150, 150)
[34, 56, 89, 134, 150, 150, 87, -34, -150, -150]
###
# testsbksl-nlvaleurs = [34, 56, 89, 134, 152, 250, 87, -34, -187, -310]bksl-nlattendu = [34, 56, 89, 134, 150, 150, 87, -34, -150, -150]bksl-nlresultat = ecrete(valeurs, -150, 150)bksl-nlassert attendu == resultat, f"Erreur, la fonction a renvoyé {resultat}"bksl-nlbksl-nl# autres testsbksl-nlbksl-nl# Question 1 :bksl-nlbksl-nlassert (bksl-nl limitepy-undamplitude(-15, -10, 10) == -10bksl-nl), "-15 est trop petit (pas entre -10 et 10), on écrête"bksl-nlassert limitepy-undamplitude(-10, -10, 10) == -10bksl-nlassert limitepy-undamplitude(-8, -10, 10) == -8bksl-nlassert limitepy-undamplitude(7, -10, 10) == 7bksl-nlassert limitepy-undamplitude(10, -10, 10) == 10bksl-nlassert (bksl-nl limitepy-undamplitude(18, -10, 10) == 10bksl-nl), "18 est trop grand (pas entre -10 et 10), on écrête"bksl-nlbksl-nlassert (bksl-nl limitepy-undamplitude(209, 210, 220) == 210bksl-nl), "209 est trop petit (pas entre 210 et 220), on écrête"bksl-nlassert limitepy-undamplitude(210, 210, 220) == 210bksl-nlassert limitepy-undamplitude(215, 210, 220) == 215bksl-nlassert limitepy-undamplitude(220, 210, 220) == 220bksl-nlassert (bksl-nl limitepy-undamplitude(221, 210, 220) == 220bksl-nl), "221 est trop grand (pas entre 210 et 220), on écrête"bksl-nlbksl-nlbksl-nl# Question 2 :bksl-nlbksl-nlvaleurs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]bksl-nlattendu = [5, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 10, 10, 10]bksl-nlresultat = ecrete(valeurs, 5, 10)bksl-nlassert resultat == attendu, f"Erreur avec {valeurs}"bksl-nlbksl-nlvaleurs = [-13, -4, 6, 5, 8, -3, -12, -3, 0, 6, 7]bksl-nlattendu = [-10, -5, -5, -5, -5, -5, -10, -5, -5, -5, -5]bksl-nlresultat = ecrete(valeurs, -10, -5)bksl-nlassert resultat == attendu, f"Erreur avec {valeurs}"bksl-nlbksl-nlvaleurs = [7, 8, 3, 9, 8, 7, 2, 4, 8, 9, 0, 1, 5, 8, 8, 8, 4, 5, 4, 5]bksl-nlattendu = [7, 8, 3, 9, 8, 7, 2, 4, 8, 9, 0, 1, 5, 8, 8, 8, 4, 5, 4, 5]bksl-nlresultat = ecrete(valeurs, 0, 10)bksl-nlassert resultat == attendu, f"Erreur avec {valeurs}"bksl-nlbksl-nlvaleurs = []bksl-nlattendu = []bksl-nlresultat = ecrete(valeurs, 0, 10)bksl-nlassert resultat == attendu, f"Erreur avec {valeurs}"bksl-nlbksl-nl 5/5

def limitepy-undamplitude(x, xpy-undmin, xpy-undmax):bksl-nl ...bksl-nlbksl-nldef ecrete(valeurs, xpy-undmin, xpy-undmax):bksl-nl valeurspy-undecretees = ...bksl-nl for ...:bksl-nl y = limitepy-undamplitude(...)bksl-nl valeurspy-undecretees.append(...)bksl-nl return valeurspy-undecreteesbksl-nlbksl-nlbksl-nl# testsbksl-nlvaleurs = [34, 56, 89, 134, 152, 250, 87, -34, -187, -310]bksl-nlattendu = [34, 56, 89, 134, 150, 150, 87, -34, -150, -150]bksl-nlresultat = ecrete(valeurs, -150, 150)bksl-nlassert attendu == resultat, f"Erreur, la fonction a renvoyé {resultat}"bksl-nlbksl-nldef limitepy-undamplitude(x, xpy-undmin, xpy-undmax):bksl-nl if x < xpy-undmin:bksl-nl return xpy-undminbksl-nl elif x > xpy-undmax:bksl-nl return xpy-undmaxbksl-nl else:bksl-nl return xbksl-nlbksl-nlbksl-nldef ecrete(valeurs, xpy-undmin, xpy-undmax):bksl-nl valeurspy-undecretees = []bksl-nl for x in valeurs:bksl-nl y = limitepy-undamplitude(x, xpy-undmin, xpy-undmax)bksl-nl valeurspy-undecretees.append(y)bksl-nl return valeurspy-undecreteesbksl-nlbksl-nl

A

La fonction limite_amplitude est composée d'une structure conditionnelle, avec trois cas.

La fonction ecrete construit une liste vide qu'elle étend par accumulation. On aurait pu faire une liste en compréhension avec le code :

🐍 Script Python
def ecrete(valeurs, x_min, x_max):
    return [limite_amplitude(x, x_min, x_max) for x in valeurs]

Pour les experts

On peut avoir aussi un code avec un style fonctionnel

🐍 Script Python
def ecrete(valeurs, x_min, x_max):
    filtre = lambda x: limite_amplitude(x, x_min, x_max)
    return list(map(filtre, valeurs))

filtre est une fonction qui pourrait aussi être définie par

🐍 Script Python
def filtre(x):
    return limite_amplitude(x, x_min, x_max)

Le constructeur lambda permet de définir une fonction anonyme, c'est parfois utile comme paramètre passé à une autre fonction.

Z