2013-08-23 15 views
6

Próbuję napisać funkcję, aby usunąć wszystkie wiersze, które mają wartość zerową w To nie jest z mojego kodu, ale przykładem idei używam.Jak usunąć wiersz z tablicy numpy zawierającej 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 

i to jest moje wyjście:

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

Jak pozbyć się wierszy z indeksem w b? Przykro mi, jestem całkiem nowy w tym, że każda pomoc będzie naprawdę doceniona.

+0

Tylko jeden komentarz. Ten fragment przykładowego kodu, który wysłałeś pętli nad 'b', aby usunąć pojedyncze wiersze. To wcale nie jest potrzebne. 'a = np.delete (a, b, axis = 0)' działa jak zaklęcie ("oś" określone, aby było bardziej oczywiste, co robimy) –

Odpowiedz

2

Wygląda np.delete does't zmiany tablicy, tylko zwraca nową tablicę, więc

Zamiast

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

spróbować

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

ah to było głupie, prawdopodobnie do wczesnego rana. Jednak zmieniłem to i dostałem ** ValueError: nieprawidłowy wpis ** dziękuję za szybką odpowiedź –

1

myślę, że znalazłem odpowiedź:

jako @tuxcanfly powiedziałem, że zmieniłem x na a. Również usunąłem pętlę for, ponieważ z jakiegoś powodu usunęło wiersz z indeksem 2.

Zamiast tego, teraz właśnie wybrałem, aby usunąć wiersze za pomocą b jako funkcja usuwania z wykorzystaniem elementów na liście, aby usunąć wiersz z tym indeksem.

nowy kod:

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 

i wyjście:

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

To może być już trochę zbyt mądry, ale myślę, że to pomaga czytelności (i pozwala na pętli raz, nie dwa razy):

#!/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 

W tej wersji przeglądasz każdy wiersz i testujesz członkostwo 0 w wierszu. Jeśli wiersz nie zawiera zera, spróbujesz użyć np.vstack do dołączenia wiersza do tablicy o nazwie b. Inicjalizacja b może być podstępna, ponieważ musi to być tablica numpy z taką samą liczbą elementów, jak rząd wiersza, ale zamiast dwukrotnej pętli i szukania pierwszej wartości, użyłem metody try/except złapać przypadek, w którym nie istnieje i przypisać, zamiast używać vstack.

10

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

Nie trzeba napisać funkcję, że można to zrobić w jednym wyrażeniu:

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

odczytywać jako: wybierz z a wszystkie wiersze, które są całkowicie niezerowe.

+0

czy jest jakiś sposób, aby to zrobić dla tablicy 1D? czy po prostu pominąłbyś specyfikację osi? to znaczy ** b [np.all (b! = 0,)] ** gdzie b jest tablicą 1d –

+2

'b = b [b! = 0]' usuwa '0' w' b'. Nazywa się to indeksowaniem boolowskim. –

+0

Co jeśli chce się usunąć wszystkie kolumny zawierające "2"? 'a [np.all (a! = 2, axis = 0)]' nie działa zgodnie z oczekiwaniami. Zamiast tego musiałem uciekać się do manipulowania transpozycją. Jakieś sugestie? –