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