2013-08-23 185 views
6

Sto cercando di scrivere una funzione per eliminare tutte le righe in cui hanno un valore pari a zero in Questo non è dal mio codice, ma un esempio dell'idea che sto usando:.Come si elimina una riga in una matrice numpy che contiene uno zero?

import numpy as np 
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0])) 
b=[] 

for i in range(len(a)): 
    for j in range (len(a[i])): 
     if a[i][j]==0: 
      b.append(i) 

print 'b=', b 
for zero_row in b: 
    x=np.delete(a,zero_row, 0) 

print 'a=',a 

e questo è la mia uscita:

b= [1, 3] 
a= [[7 1 2 8] 
[4 0 3 2] 
[5 8 3 6] 
[4 3 2 0]] 

Come sbarazzarmi delle righe con l'indice in b? Scusate, sono abbastanza nuovo per questo ogni aiuto sarebbe molto apprezzato.

+0

Solo un commento. Quel pezzo di codice di esempio che hai postato scorre su 'b' per eliminare singole righe. Non è affatto necessario. 'a = np.delete (a, b, axis = 0)' funziona come un incantesimo ('asse' specificato per rendere più evidente quello che stiamo facendo) –

risposta

2

Sembra np.delete cambiamento does't l'array, restituisce solo un nuovo array, così

Invece di

x = np.delete(a,zero_row, 0) 

provare

a = np.delete(a,zero_row, 0) 
+0

ah che era stupido, probabilmente al mattino presto. Comunque ho cambiato e ho ottenuto ** ValueError: entry non valido ** grazie per la risposta rapida –

1

Credo di aver trovato la risposta:

come @tuxcanfly ha detto che ho cambiato x in a. Inoltre ho rimosso il ciclo for in quanto ha rimosso la riga con indice 2 per qualche motivo.

Invece ora ho appena scelto di eliminare le righe utilizzando b come funzione di eliminazione con gli elementi dell'elenco per rimuovere la riga con quell'indice.

il nuovo codice:

import numpy as np 
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0])) 
b=[] 

for i in range(len(a)): 
    for j in range (len(a[i])): 
     if a[i][j]==0: 
      b.append(i) 
print 'b=',b 
for zero_row in b: 
    a=np.delete(a,b, 0) 

print 'a=',a 

e l'uscita:

b= [1, 3] 
a= [[7 1 2 8] 
[5 8 3 6]] 
0

Questo può essere sempre un po 'troppo intelligente, ma penso che aiuta la leggibilità (e vi permette di ciclo una volta, non due volte):

#!/usr/bin/env python 

import numpy as np 
a = np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0])) 

for i in a: 
    if not (0 in i): 
     try: 
      b = np.vstack((b, i)) 
     except NameError: 
      b = i 
a = b 
print 'a = ', a 

In questa versione, si esegue il ciclo su ciascuna riga e si verifica l'appartenenza di 0 alla riga. Se la riga non contiene uno zero, si tenta di utilizzare np.vstack per aggiungere la riga a un array denominato b. Ora, inizializzare b potrebbe essere altrimenti complicato, perché deve essere una matrice numpy con lo stesso numero di elementi di una riga di a, ma piuttosto che ripetere due volte il ciclo e andare a cercare un primo valore per questo, ho appena usato un tentativo/eccetto per catturare il caso in cui non esiste e assegnare piuttosto che utilizzare vstack.

10

I'm trying to write a function to delete all rows in which have a zero value in.

Non è necessario scrivere una funzione per questo, può essere fatto in una sola espressione:

>>> a[np.all(a != 0, axis=1)] 
array([[7, 1, 2, 8], 
     [5, 8, 3, 6]]) 

Leggi come: seleziona dalla a tutte le righe che sono interamente non-zero.

+0

c'è un modo per fare questo per un array 1D? vorresti semplicemente lasciare fuori le specifiche dell'asse? cioè ** b [np.all (b! = 0,)] ** dove b è un array 1d –

+2

'b = b [b! = 0]' rimuove il '0' in' b'. Si chiama indicizzazione booleana. –

+0

Cosa succede se si desidera rimuovere tutte le colonne contenenti "2"? 'a [np.all (a! = 2, axis = 0)]' non funziona come previsto. Ho dovuto ricorrere invece a manipolare la trasposizione. Qualche suggerimento? –