supprimer des lignes dans le tableau de nummpy

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

notez que l'une des lignes a une valeur zéro à la fin. Je veux supprimer toute ligne qui contient un zéro, tout en gardant toute ligne qui contient des valeurs non-zéro dans toutes les cellules.

mais le tableau aura des nombres de lignes différents chaque fois qu'il est peuplé, et les zéros seront localisés dans des lignes différentes chaque fois.

, j'obtiens le nombre de non-zéro éléments dans chaque ligne avec la ligne de code suivante:

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

pour le tableau ci-dessus, NumNonzeroElementsInRows contient: [54]

les cinq indiquent que toutes les valeurs possibles de la rangée 0 sont non nulles, tandis que les quatre indiquent qu'une des valeurs possibles de la rangée 1 est un zéro.

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

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

But pour une raison quelconque, ce code ne semble pas faire quoi que ce soit, même si faire beaucoup de commandes d'impression indique que toutes les variables semblent peupler correctement conduisant le code.

Il doit y avoir un moyen facile de simplement "supprimer toute ligne qui contient la valeur zéro."

est-ce que quelqu'un peut me montrer quel code écrire pour accomplir ceci?

60
demandé sur Unihedron 2010-10-07 02:55:34

6 réponses

le moyen le plus simple de supprimer les lignes et les colonnes des tableaux est la méthode numpy.delete .

supposons que j'ai le tableau suivant x :

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

Pour supprimer la première ligne, faites ceci:

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

Pour supprimer la troisième colonne, faites ceci:

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

pour que vous puissiez trouver les indices des lignes qui ont un 0 en eux, les mettre dans une liste ou un tuple et passer ceci comme la seconde l'argument de la fonction.

114
répondu Jaidev Deshpande 2015-02-15 19:48:10

Voici une doublure (oui, il est similaire à l'user333700, mais un peu plus simple):

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

soit dit en passant, cette méthode est beaucoup, beaucoup plus rapide que la méthode des tableaux masqués pour les grandes matrices. Pour une matrice 2048 x 5, cette méthode est environ 1000x plus rapide.

soit dit en passant, la méthode de l'utilisateur 333700 (de son commentaire) était légèrement plus rapide dans mes tests, bien que cela me trouble l'esprit pourquoi.

13
répondu Justin Peel 2010-10-07 03:33:29

c'est similaire à votre approche originale, et utilisera moins d'espace que réponse de unutbu , mais je soupçonne qu'il sera plus lent.

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

soit dit en passant, votre ligne p.delete() ne fonctionne pas pour moi - ndarray s n'ont pas d'attribut .delete .

4
répondu mtrw 2017-05-23 12:26:32

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

2
répondu jeps 2011-04-21 12:12:09

il est peut-être trop tard pour répondre à cette question, mais je voulais partager mon point de vue au profit de la communauté. Pour cet exemple, laissez-moi appeler votre matrice "ANOVA", et je suppose que vous essayez juste de supprimer les lignes de cette matrice avec 0 seulement dans la cinquième colonne.

indx = []
for i in range(len(ANOVA)):
    if int(ANOVA[i,4]) == int(0):
        indx.append(i)

ANOVA = [x for x in ANOVA if not x in indx]
0
répondu troymyname00 2018-03-04 21:12:23
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.)])
0
répondu Prokhozhii 2018-08-20 20:29:53