Ich möchte ein numpy
array
(oder pandas
DataFrame
) so filtern, dass nur fortlaufende Serien desselben Werts mit mindestens window_size
length beibehalten und alles andere auf 0 gesetzt wird .
Zum Beispiel:
%Vor%sollte bei Verwendung einer Fenstergröße von 4
werden %Vor% Ich habe versucht, rolling_apply
und scipy.ndimage.filtes.gerneric_filter
zu verwenden, aber aufgrund der Art der Rolling Kernel-Funktionen denke ich nicht, dass es der richtige Ansatz hier ist (und ich bin im Moment dran).
Ich setze meinen Versuch trotzdem hier ein:
%Vor% Das ist im Grunde ein image closing operation in image-processing
für einen 1D-Fall. Solche Operationen könnten mit Faltungsverfahren implementiert werden. Nun, NumPy does support 1D convolution
, also haben wir Glück! Also, um unseren Fall zu lösen, wäre es so etwas -
Beispiellauf -
%Vor%Laufzeittests -
In diesem Abschnitt werden einige andere Ansätze aufgeführt, um die gestellte Frage zu lösen. Ihre Definitionen sind unten aufgeführt -
%Vor%Zeiten -
%Vor% Hier ist ein Ansatz mit pd.rolling_min
und Schritttricks:
Dann haben wir:
%Vor%Bei großen Arrays ist dieser Ansatz ziemlich schnell (auf meiner Systemgruppe ist er etwa 20 mal langsamer):
%Vor%Es könnte sehr wohl eine bessere Lösung geben, aber ich denke, das sollte funktionieren:
%Vor%Ich habe einige andere Zahlen darin eingefügt, nur für den Fall, dass Sie Code dafür benötigen;
%Vor%Die erste Zeile teilt das ursprüngliche Array in aufeinanderfolgende Zeichen auf, die zweite Zeile ersetzt jedes Element, das weniger als 4 aufeinanderfolgende Zeichen enthält, mit 0 und die letzte Zeile flacht die Aufteilungsliste ab.
%Vor%Die erste Zeile der Lösung verwendet auch eine frühere SO-Antwort
Tags und Links python performance numpy pandas scipy