Wie kann ich einen gleitenden Durchschnitt eines Vektors (effizient) berechnen?

7

Ich habe einen Vektor und möchte den gleitenden Durchschnitt berechnen (mit einem Fenster der Breite 5).

Wenn der fragliche Vektor beispielsweise [1,2,3,4,5,6,7,8] ist, dann

  • Der erste Eintrag des resultierenden Vektors sollte die Summe aller Einträge in [1,2,3,4,5] (d. h. 15 );
  • sein
  • Der zweite Eintrag des resultierenden Vektors sollte die Summe aller Einträge in [2,3,4,5,6] (d. h. 20 );
  • sein
  • usw.

Am Ende sollte der resultierende Vektor [15,20,25,30] sein. Wie kann ich das tun?

    
user3034281 17.11.2014, 20:34
quelle

3 Antworten

18

Die Funktion conv befindet sich direkt auf Ihrer Seite:

%Vor%

Benchmark

Drei Antworten, drei verschiedene Methoden ... Hier ist ein kurzer Benchmark (verschiedene Eingabegrößen, feste Fensterbreite von 5) mit timeit ; fühlen Sie sich frei, Löcher darin zu stoßen (in den Kommentaren), wenn Sie denken, dass es verfeinert werden muss.

conv erscheint als der schnellste Ansatz; es ist etwa doppelt so schnell wie Münzansatz (mit filter ) und etwa viermal so schnell wie Luis Mendos Ansatz (mit cumsum ) .

Hier ist ein weiterer Benchmark (feste Eingabegröße von 1e4 , unterschiedliche Fensterbreiten). Hier stellt sich Luis Mendos Ansatz cumsum als klarer Gewinner heraus, da seine Komplexität in erster Linie von der Länge der Eingabe bestimmt wird und ist unempfindlich für die Breite des Fensters.

Fazit

Um zusammenzufassen, sollten Sie

  • Verwenden Sie den conv -Ansatz, wenn Ihr Fenster relativ klein ist,
  • Verwenden Sie den Ansatz cumsum , wenn Ihr Fenster relativ groß ist.

Code (für Benchmarks)

%Vor% %Vor%     
Jubobs 17.11.2014, 20:52
quelle
3

Eine andere Möglichkeit besteht darin, cumsum zu verwenden. Dieser Ansatz erfordert wahrscheinlich weniger Operationen als conv :

%Vor%

Um etwas Zeit zu sparen, können Sie die letzte Zeile durch

ersetzen %Vor%     
Luis Mendo 18.11.2014 00:13
quelle
2

Wenn Sie die Größe Ihres Eingabevektors beibehalten möchten, empfehle ich die Verwendung von filter

%Vor%     
nowox 17.11.2014 21:50
quelle

Tags und Links