105 votes

supprimer des lignes dans un tableau numpy

J'ai un tableau qui pourrait ressembler à ceci :

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]

Remarquez que l'une des lignes a une valeur nulle à la fin. Je souhaite supprimer toute ligne contenant un zéro, tout en conservant toute ligne contenant des valeurs non nulles dans toutes les cellules.

Mais le tableau aura un nombre de lignes différent à chaque fois qu'il sera rempli, et les zéros seront situés dans des lignes différentes à chaque fois.

J'obtiens le nombre d'éléments non nuls dans chaque ligne avec la ligne de code suivante :

NumNonzeroElementsInRows    = (ANOVAInputMatrixValuesArray != 0).sum(1)

Pour le tableau ci-dessus, NumNonzeroElementsInRows contient : [5 4]

Le chiffre cinq indique que toutes les valeurs possibles de la ligne 0 sont non nulles, tandis que le chiffre quatre indique que l'une des valeurs possibles de la ligne 1 est nulle.

Par conséquent, j'essaie d'utiliser les lignes de code suivantes pour trouver et supprimer les lignes qui contiennent des valeurs nulles.

for q in range(len(NumNonzeroElementsInRows)):
    if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
        p.delete(ANOVAInputMatrixValuesArray, q, axis=0)

Mais pour une raison quelconque, ce code ne semble rien faire, même si l'exécution de nombreuses commandes d'impression indique que toutes les variables semblent se remplir correctement jusqu'au code.

Il doit y avoir un moyen simple de "supprimer toute ligne contenant une valeur nulle".

Quelqu'un peut-il m'indiquer le code à écrire pour y parvenir ?

204voto

Jaidev Deshpande Points 2546

La façon la plus simple de supprimer des lignes et des colonnes d'un tableau est d'utiliser la fonction numpy.delete méthode.

Supposons que je dispose du tableau suivant x :

x = array([[1,2,3],
        [4,5,6],
        [7,8,9]])

Pour supprimer la première ligne, procédez comme suit :

x = numpy.delete(x, (0), axis=0)

Pour supprimer la troisième colonne, procédez comme suit :

x = numpy.delete(x,(2), axis=1)

Vous pouvez donc trouver les indices des lignes contenant un 0, les placer dans une liste ou un tuple et les transmettre en tant que deuxième argument de la fonction.

14voto

Justin Peel Points 17348

Voici un exemple (oui, il est similaire à celui de l'utilisateur 333700, mais un peu plus direct) :

>>> import numpy as np
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], 
                [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
>>> print arr[arr.all(1)]
array([[ 0.96488889,  0.73641667,  0.67521429,  0.592875  ,  0.53172222]])

Cette méthode est d'ailleurs beaucoup plus rapide que la méthode des tableaux masqués pour les grandes matrices. Pour une matrice de 2048 x 5, cette méthode est environ 1000 fois plus rapide.

D'ailleurs, la méthode de l'utilisateur 333700 (d'après son commentaire) a été légèrement plus rapide dans mes tests, mais je ne comprends pas pourquoi.

5voto

mtrw Points 10098

Cette méthode est similaire à votre approche initiale et utilise moins d'espace que la méthode Réponse de unutbu mais je soupçonne qu'elle sera plus lente.

>>> import numpy as np
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]])
>>> p
array([[ 1.5,  0. ],
       [ 1.4,  1.5],
       [ 1.6,  0. ],
       [ 1.7,  1.8]])
>>> nz = (p == 0).sum(1)
>>> q = p[nz == 0, :]
>>> q
array([[ 1.4,  1.5],
       [ 1.7,  1.8]])

D'ailleurs, votre ligne p.delete() ne fonctionne pas pour moi - ndarray n'ont pas de .delete attribut.

2voto

jeps Points 21

Numpy fournit une fonction simple pour faire exactement la même chose : Supposons que vous ayez un tableau masqué 'a', appeler numpy.ma.compress_rows(a) supprimera les lignes contenant une valeur masquée. Je suppose que c'est beaucoup plus rapide de cette façon...

1voto

Prokhozhii Points 112
import numpy as np 
arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
print(arr[np.where(arr != 0.)])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X