Mehrere Ebenen der booleschen Indexmaske in NumPy verwenden

8

Ich habe den folgenden Code, der zuerst Elemente eines NumPy-Arrays mit einer logischen Indexmaske auswählt:

%Vor%

Ich möchte eine zweite boolesche Maske gegen diese verwenden, um Objekte mit auszuwählen:

%Vor%

Dies ist nicht das gleiche Problem wie in dieser SO-Frage aufgeführt: Numpy-Array, wie Indizes ausgewählt werden, die mehrere Bedingungen erfüllen ? - Da ich die Zufallszahlenerzeugung verwende, möchte ich nicht nur für die Elemente, die von der ersten Maske ausgewählt werden, eine vollständige Maske erzeugen müssen.

    
Hemmer 24.08.2011, 17:12
quelle

4 Antworten

6

Ich glaube, das Folgende macht das, was Sie fragen:

%Vor%

Es funktioniert wie folgt:

  • np.where(mask) konvertiert die boolesche Maske in die Indizes, in denen mask True ist;
  • [a[second_mask] for a in ...] untergliedert die Indizes so, dass nur diejenigen ausgewählt werden, für die second_mask True ist.

Der Grund, warum Ihre ursprüngliche Version nicht funktioniert, ist, dass grid[mask] eine ausgefallene Indizierung beinhaltet. Dadurch wird eine Kopie der Daten erstellt, die dazu führt, dass ...[second_mask] = 100 diese Kopie anstelle des ursprünglichen Arrays ändert.

    
NPE 24.08.2011, 17:26
quelle
2

Die Verwendung der flachen Indizierung vermeidet viele Kopfschmerzen:

%Vor%

Aufbrechen:

%Vor%

erzeugt ein flaches Array von Indizes, wobei mask wahr ist, was dann durch Anwendung von second_mask :

weiter dezimiert wird %Vor%

Wir könnten weitermachen:

%Vor%

Endlich

%Vor%

indexiert eine flache Version von grid mit ind und weist 100 zu. grid.ravel()[ind] = 100 würde auch funktionieren, da ravel() eine flache Ansicht in das ursprüngliche Array zurückgibt.

    
Stefan 11.06.2013 17:55
quelle
0

Eine andere mögliche Lösung, die mir einfällt, wenn ich darüber nachdenke, ist, dass die zweite Karte die Größe der ersten behält (was den Speichertreffer wert ist oder nicht) und selektiv die neuen Elemente hinzufügt:

%Vor%

Obwohl das ein bisschen länger ist, scheint es besser zu lesen (für meine Anfängeraugen), und in Geschwindigkeitstests läuft es gleichzeitig.

    
Hemmer 25.08.2011 14:28
quelle
0
%Vor%     
Adobe 29.03.2014 11:52
quelle

Tags und Links