Ich habe ein 3D-numpy-Array, das so aussieht
%Vor%Jede Spur des Arrays endet mit 0 oder mehreren (weniger als 70 bin ich sicher) -1 .
Vorerst möchte ich für jede Spur nur 30 Werte vor dem -1 auswählen, um eine Teilmenge des ursprünglichen numpy-Arrays mit der Form (3,1000,30)
Sollte ähnlich sein,
%Vor%Ist es möglich mit einigen anonymen Funktionen zu arbeiten? Hoffnung ohne eine for-Schleife:)
Hier ist einer, der broadcasting
und advanced-indexing
-
Beispiellauf -
Setup für reproduzierbare Eingabe:
%Vor%Eingabe, Ausgabe:
%Vor% Dies ist eine Lösung, die auf der Idee basiert, die zu haltenden Indizes zu berechnen. Wir verwenden numpy.argmin
und numpy.nonzero
, um den Anfang von -1
oder das Ende der Zeile zu finden, und verwenden dann 2-dimensionale Addition / Subtraktion, um die Indizes der 30 Elemente zu erstellen, die beibehalten werden müssen.
Zunächst erstellen wir reproduzierbare Beispieldaten
%Vor%Sie können diesen Schritt natürlich überspringen, ich habe ihn einfach hinzugefügt, damit andere diese Lösung reproduzieren können. :)
Gehen wir nun Schritt für Schritt durch den Code:
Ändern Sie die Form von a, um den Code zu vereinfachen
%Vor%Finde den Index von -1 in jeder Zeile von a
%Vor%Ersetzen Sie alle Indizes für Zeilen von a ohne -1 durch 100
%Vor%Indizes in 1D übersetzen
%Vor%Berechnen Sie Indizes für alle Elemente, die beibehalten werden sollen. Wir machen die Indizes zweidimensional, so dass wir die 30 Indizes vor jedem -1 Index erhalten.
%Vor%Filterung durchführen
%Vor%Zurück zur gewünschten Form
%Vor% Hier ist eine mit stride_tricks
für den effizienten Abruf von Slices:
Benchmarks, beste Lösung ist eine Mischung aus @ Divakar und Mine, @ Florian Rhiem ist auch ziemlich schnell:
%Vor%Beispielausgabe:
%Vor%