Comment supprimer les lignes d'un tableau numpy en fonction d'une condition en python ?

Published: 18 septembre 2023

Tags: Python; Numpy;

DMCA.com Protection Status

Considérons un tableau numpy 2D avec 6 lignes et 4 colonnes. Notre objectif est d'éliminer les lignes qui contiennent la valeur -999 :

Créez un tableau numpy en 2D.

import pandas as pd
import numpy as np

data = np.array([[44., 99.,  2., 93.],
                 [51., 72., 75., 28.],
                 [89.,  -999., 17., 17.],
                 [73., 11., 81.,  3.],
                 [83., 59., 41.,  -999.],
                 [34., 94., 51., 84.]])

Utilisation de any()

Si l'objectif est d'éliminer toutes les lignes contenant la valeur -999, quelle que soit la colonne dans laquelle elle apparaît, une solution consiste à utiliser any():

(data == -999.).any(axis=1)

retourne ici.

array([False, False,  True, False,  True, False])

Puisque les lignes d'index 2 et 4 contiennent une valeur de -999 (en tenant compte du fait que Python utilise un index à partir de 0).

Pour ne conserver que les lignes sans -999, une solution consiste à prendre l'inverse en utilisant l'opérateur python ~:

~(data == -999.).any(axis=1)

qui donne

array([ True,  True, False,  True, False,  True])

et définir un nouveau tableau:

new_data = data[ ~(data == -999.).any(axis=1) , :  ]

print(new_data)

qui renverra:

array([[44., 99.,  2., 93.],
       [51., 72., 75., 28.],
       [73., 11., 81.,  3.],
       [34., 94., 51., 84.]])

Filtrez les lignes en fonction d'une condition spécifique dans une colonne particulière

Par exemple, supprimez les lignes s'il y a une valeur de -999 dans la colonne d'index 1 (ce qui signifie la deuxième colonne).

data[ data[:,1] != -999. ]

donne

array([[  44.,   99.,    2.,   93.],
       [  51.,   72.,   75.,   28.],
       [  73.,   11.,   81.,    3.],
       [  83.,   59.,   41., -999.],
       [  34.,   94.,   51.,   84.]])

Filtrer les lignes en fonction d'une condition spécifique dans plusieurs colonnes.

Utilisation d'une condition avec l'opérateur &.

data[ (data[:, 1] != -999.) & (data[:, 3] != -999.) ]

donne

array([[44., 99.,  2., 93.],
       [51., 72., 75., 28.],
       [73., 11., 81.,  3.],
       [34., 94., 51., 84.]])

Utilisation de any ()

Remarquez que:

(data[:, [1,3]] == -999.).any(axis=1)

donne

array([False, False,  True, False,  True, False])

Alors

data[ ~(data[:, [1,3]] == -999.).any(axis=1), :  ]

donne

array([[44., 99.,  2., 93.],
       [51., 72., 75., 28.],
       [73., 11., 81.,  3.],
       [34., 94., 51., 84.]])

Références

Liens Site
numpy.any numpy.org
numpy.invert numpy.org