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?
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 ...
Hier ist eine Lösung mit np.maximum.accumulate
:
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:
Dann sieht arr
wie folgt aus:
Dann indexieren wir einfach in prev
mit arr
und wir erhalten unser Ergebnis. Ein Test:
Hinweis : Achten Sie darauf, was zu tun ist, wenn der erste Eintrag Ihres Arrays Null ist:
%Vor%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: )
Wenn die 0
s nur in Strings von 1 vorkommen, könnte diese Verwendung von nonzero
funktionieren:
Ich kann Ihre arr
behandeln, indem Sie dies wiederholt anwenden, bis I
leer ist.
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.