2017-03-02 11 views
0

Let h meine MatrixWie löscht man alle Vorkommen eines Wertes aus einer Matrix?

h=[[0,346,34,6,7,0,0,34634,6,0],[2352,205230,523,50,5023,502,350,0,0]] 

und ich möchte sein von h alle Nullen löschen.

So soll das Ergebnis sein:

h=[[346,34,6,7,34634,6],[2352,205230,523,50,5023,502,350]] 

ich verschiedene Dinge aus HERE und anderen Fragen versucht, aber nichts scheint für eine Matrix zu arbeiten. Gibt es dafür eine nette Lösung?

+0

ist dies eine numpige Matrix? – ZdaR

Antwort

2

Wenn Sie die Matrix in-Place ändern möchten, könnten Sie es mit einer Funktion wie folgt tun. Der Trick besteht darin, die Elemente jeder Reihe rückwärts zu durchlaufen, so dass die Indizes aufeinander folgender Elemente nicht geändert werden, weil früher Elemente entfernt wurden.

def remove_zeros(matrix): 
    for row in matrix: 
     length = len(row)-1 
     for i, elem in enumerate(reversed(row)): 
      if not elem: # zero value? 
       row.pop(length-i) 

h = [[0, 346, 34, 6, 7, 0, 0, 34634, 6, 0], [2352, 205230, 523, 50, 5023, 502, 350, 0, 0]] 

remove_zeros(h) 

print(h) # -> [[346, 34, 6, 7, 34634, 6], [2352, 205230, 523, 50, 5023, 502, 350]] 
+0

Ich würde 'reversed (row)' anstelle von 'row [:: - 1]' –

+0

@FelipeNardiBatista: Sicher, das würde auch funktionieren, und ist lesbarer. Die meisten "Pythonistas" würden jedoch sofort das '[:: = 1]' erkennen, da es das war, was üblicherweise verwendet wurde, bevor das eingebaute 'reversed()' zur Sprache hinzugefügt wurde. – martineau

+0

ja, aber im Moment ist es lesbarer und effizienter, da es die Zeile nicht kopiert, es iteriert nur darüber –

2

Sie können einfach Liste Verständnis verwenden:

h = [[element for element in row if element] for row in h]

So hier sind wir alle row in h iterieren. Für jede Zeile erstellen wir eine neue Liste [element for element in row if element]. Dies bedeutet, dass wir für jede element in dieser row überprüfen, ob es gleich 0 (mit if element) ist. Ist dies nicht der Fall, ist bool(element)True und somit fügen wir element zu dieser Liste hinzu. Ansonsten unterlassen wir element.

+0

'chain.from_iterable (h.tolist())' anstelle von 'h' wenn es sich um eine' numpy' Matrix handelt. –

+0

@NickilMaveli: Warum musst du "ketten"? –

+0

Es ist, weil 'tolist()' eine zusätzliche äußere 'liste' erstellt, die Sie abflachen müssten. –

Verwandte Themen