Wie wird eine Teilmenge von 3D-Numpy-Arrays ausgewählt, die auf einen Wert enden?

8

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)

zu erstellen

Sollte ähnlich sein,

%Vor%

Ist es möglich mit einigen anonymen Funktionen zu arbeiten? Hoffnung ohne eine for-Schleife:)

    
Jiayu Zhang 21.11.2017, 05:00
quelle

3 Antworten

12

Hier ist einer, der broadcasting und advanced-indexing -

%Vor%

Beispiellauf -

Setup für reproduzierbare Eingabe:

%Vor%

Eingabe, Ausgabe:

%Vor%     
Divakar 21.11.2017, 05:48
quelle
6

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:

  1. Ändern Sie die Form von a, um den Code zu vereinfachen

    %Vor%
  2. Finde den Index von -1 in jeder Zeile von a

    %Vor%
  3. Ersetzen Sie alle Indizes für Zeilen von a ohne -1 durch 100

    %Vor%
  4. Indizes in 1D übersetzen

    %Vor%
  5. 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%
  6. Filterung durchführen

    %Vor%
  7. Zurück zur gewünschten Form

    %Vor%
Florian Rhiem 21.11.2017 05:43
quelle
5

Hier ist eine mit stride_tricks für den effizienten Abruf von Slices:

%Vor%

Benchmarks, beste Lösung ist eine Mischung aus @ Divakar und Mine, @ Florian Rhiem ist auch ziemlich schnell:

%Vor%

Beispielausgabe:

%Vor%     
Paul Panzer 21.11.2017 06:10
quelle

Tags und Links