Comment supprimer une ou plusieurs lignes d'une matrice avec numpy sous python ?

Published: 16 janvier 2015

Updated: 18 septembre 2023

Tags: Python; Numpy;

DMCA.com Protection Status

Exemples de comment supprimer des lignes d'un tableau numpy pour différents cas :

Créez un tableau numpy 2D

Commençons par créer un tableau 2D de base avec numpy.

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.]])

Supprimer les lignes en utilisant delete()

La manière la plus simple de supprimer des lignes d'un tableau numpy est d'utiliser la fonction numpy.delete. Cette fonction prend deux arguments : un tableau et une liste d'indices (les positions des éléments que vous souhaitez supprimer) :

Supprimer une ligne spécifique basée sur son index

Pour supprimer une ligne spécifique avec un index donné, une solution consiste à utiliser delete():

np.delete(data, (2), axis=0)

donne

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

Supprimer plusieurs lignes

np.delete(data, (2,4), axis=0)

donne

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

Supprimer les lignes en fonction d'une condition de colonne

Supprimer les lignes en utilisant any()

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

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

donne ici

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

Puisque les lignes d'index 2 et 4 contiennent une valeur de -999 (en gardant à l'esprit que Python utilise un index basé sur 0).

Maintenant, pour ne conserver que les lignes sans -999, une solution consiste à prendre l'inverse à l'aide de l'opérateur python ~ :

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

ce qui donne:

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

et définissez un nouvel tableau :

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

print(new_data)

ce qui donne

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

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

Par exemple, supprimer les lignes s'il y a une valeur de -999 dans la colonne d'indice 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.]])

Avec any()

Notez 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.delete numpy.org
numpy.any numpy.org
numpy.invert numpy.org