Python / numpy: Der effizienteste Weg, um n Elemente eines Arrays zu summieren, so dass jedes Ausgabeelement die Summe der vorherigen n Eingabeelemente ist?

7

Ich möchte eine Funktion schreiben, die ein abgeflachtes Array als Eingabe verwendet und ein Array gleicher Länge zurückgibt, das die Summe der vorherigen n Elemente aus dem Eingabearray enthält, wobei die anfänglichen n - 1 -Elemente des Ausgabearrays auf% gesetzt sind. co_de%.

Zum Beispiel, wenn das Array zehn NaN hat und elements = [2, 4, 3, 7, 6, 1, 9, 4, 6, 5] , dann sollte das resultierende Array n = 3 sein.

Eine Möglichkeit, wie ich das machen könnte:

%Vor%

Gibt es einen besseren / effizienteren / mehr "pythonischen" Weg, dies zu tun?

Vielen Dank im Voraus für Ihre Hilfe.

    
James Adams 30.12.2015, 20:52
quelle

3 Antworten

9

Sie können np.cumsum verwenden und den Unterschied nutzen des Arrays cumsum ed und eine verschobene Version davon:

%Vor%

IMO, dies ist ein numpyish Weg, dies zu tun, vor allem, weil es die Schleife vermeidet.

Timings

%Vor%     
shx2 30.12.2015 20:59
quelle
7

Sie führen im Grunde 1D convolution dort aus, so dass Sie np.convolve , wie so -

%Vor%

Beispiellauf -

%Vor%

Für 1D-Faltung kann auch Scipy's implementation verwendet werden. . Die Laufzeiten mit Scipy-Version schienen für eine große Fenstergröße besser zu sein, da auch die nachfolgend aufgeführten Laufzeittests versuchen würden zu untersuchen. Die Scipy-Version für den Erhalt von vals wäre -

%Vor%

Die Operation NaNs padding könnte durch np.hstack ersetzt werden. : np.hstack(([np.nan]*(n-1),vals)) für bessere Leistung.

Laufzeittests -

%Vor%     
Divakar 30.12.2015 21:02
quelle
4

Die anderen Antworten hier sind wahrscheinlich näher an dem, was Sie in Bezug auf Geschwindigkeit und Speicher suchen, aber der Vollständigkeit halber können Sie auch ein Listenverständnis verwenden, um Ihr Array zu erstellen:

%Vor%

gibt zurück:

%Vor%     
xnx 30.12.2015 21:20
quelle