Füllen Sie die Nullwerte von 1d numpy Array mit letzten Werten ungleich Null

8

Nehmen wir an, wir haben ein 1d-numpy-Array, das mit einigen int -Werten gefüllt ist. Und sagen wir mal, einige davon sind 0 .

Gibt es eine Möglichkeit, die numpy -Array-Leistung zu verwenden, um alle 0 -Werte mit den letzten gefundenen Werten ungleich Null zu füllen?

zum Beispiel:

%Vor%

Eine Möglichkeit, dies zu tun, wäre mit dieser Funktion:

%Vor%

Dies verwendet jedoch eine rohe python for -Schleife, anstatt die numpy und scipy power zu nutzen.

Wenn wir wüssten, dass eine vernünftige kleine Anzahl von aufeinanderfolgenden Nullen möglich ist, könnten wir etwas basierend auf numpy.roll verwenden. Das Problem ist, dass die Anzahl der aufeinander folgenden Nullen potenziell groß ist ...

Irgendwelche Ideen? Oder sollten wir direkt zu Cython gehen?

Haftungsausschluss:

Ich würde sagen, ich habe vor langer Zeit eine Frage im Stackoverflow gestellt, in der ich etwas ähnliches oder Ähnliches gefragt habe. Ich konnte es nicht finden. : - (

Vielleicht habe ich die richtigen Suchbegriffe verpasst, tut mir leid für das Duplikat. Vielleicht war es nur meine Vorstellungskraft ...

    
mgab 27.05.2015, 17:07
quelle

3 Antworten

14

Hier ist eine Lösung mit np.maximum.accumulate :

%Vor%

Wir konstruieren ein Array prev , das die gleiche Länge wie arr hat, und so dass prev[i] der Index des letzten Eintrags ungleich Null vor dem i -ten Eintrag von ist %Code%. Zum Beispiel, wenn:

%Vor%

Dann sieht arr wie folgt aus:

%Vor%

Dann indexieren wir einfach in prev mit arr und wir erhalten unser Ergebnis. Ein Test:

%Vor%

Hinweis : Achten Sie darauf, was zu tun ist, wenn der erste Eintrag Ihres Arrays Null ist:

%Vor%     
jme 27.05.2015, 17:26
quelle
4

Inspiriert von jme 's Antwort hier und von Bas Swinckels (in der verknüpften Frage) habe ich eine andere Kombination von numpigen Funktionen gefunden:

%Vor%

Ich denke, es ist prägnant und funktioniert auch, also poste ich es hier für die Aufzeichnung. Dennoch ist jme auch prägnant und einfach zu folgen und scheint schneller zu sein, also akzeptiere ich es: )

    
mgab 28.05.2015 13:38
quelle
1

Wenn die 0 s nur in Strings von 1 vorkommen, könnte diese Verwendung von nonzero funktionieren:

%Vor%

Ich kann Ihre arr behandeln, indem Sie dies wiederholt anwenden, bis I leer ist.

%Vor%

Wenn die Zeichenfolgen von 0 lang sind, ist es möglicherweise besser, nach diesen Zeichenfolgen zu suchen und sie als Block zu behandeln. Aber wenn die meisten Strings kurz sind, kann diese wiederholte Anwendung die schnellste Route sein.

    
hpaulj 27.05.2015 17:33
quelle

Tags und Links