2016-01-19 8 views
5

Ich frage mich, ob es eine Funktion gibt, die gleichzeitig gleitenden Durchschnitt berechnen und mit np.diff kombinieren würde?Funktion, die ähnlich ist wie numpy diff

Wenn Sie ein Array haben, berechnen Sie einen Mittelwert für ein sich bewegendes Fenster (gleitender Durchschnitt) und berechnen den Unterschied zwischen diesem Mittelwert und dem nächsten 1 Element.

Beispiel:

a = [1, 3, 4, 5, 15, 14, 16, 13] 
b = np.diff(a) 
#np.diff makes something like this: `[n] - [n-1]` 
#I want something like this: `[n] - np.mean([n-m : n])` 

#I would like to have a function, where I could vary `m`: 

m = 2 
d = [2, 1.5, 10.5, 4, 1.5, -2] 

Wie würde ich es implementieren, so dass Zeitberechnung nicht so lange dauern würde, da ich es für eine Reihe von 26000 Elementen verwenden möchte und höher m?

Antwort

3

Edit 1: OP hat seine Frage aktualisiert, nachdem ich meine erste Antwort gegeben hatte. Die aktualisierte Antwort kann nach EDIT2 gefunden werden.

nicht sicher, was genau Sie versuchen, in diesem Fall zu tun, aber man könnte die folgende, um einfach tun zu erhalten diff:

import numpy as np 
diff = np.array(array[n-1:]) - np.array(average[:-n+2]) 

Dann diff wird die gewünschte Ausgabe sein:

array([ 2. , 1.5, 10.5, 4. , 1.5, -2. ]) 

Sie zerschneiden zuerst Ihre Listen mit dem Parameter n, dann konvertieren Sie Ihre Listen in Arrays und subtrahieren sie voneinander. Die obige Codezeile wäre noch einfacher, wenn a) Ihre Listen die gleiche Länge hätten, b) n wäre Ihr Index und nicht das Element, mit dem Sie beginnen möchten und c) wenn Sie anstelle von Listen numpy Arrays verwenden:

import numpy as np 

# add one additional value so that the arrays have the same length 
myArray = np.array([1, 3, 4, 5, 15, 14, 16, 13, 17]) 

# choose the starting index rather than the element 
n = 2 

myAverage = np.array([2, 3.5, 4.5, 10, 14.5, 15, 14.5]) 

diffAr = myArray[n:] - myAverage 

Dann sieht diffAr wie dieses (ein Element mehr als in Ihrem Fall, da ich ein Element zu myArray hinzugefügt):

array([ 2. , 1.5, 10.5, 4. , 1.5, -2. , 2.5]) 

nur eine allgemeine Bemerkung: Bitte nicht array und diff als Variablennamen verwenden.

EDIT2:

Sie haben Ihre Frage geändert; Hier ist jetzt eine aktualisierte Antwort. Das einzige, was man der obigen Antwort hinzufügen muss, ist eine Möglichkeit, den laufenden Mittelwert bei der Fenstergröße m zu berechnen. Danach kann man genau das tun, was ich oben tat

import numpy as np 

def runningMean(ar, m): 

    return np.convolve(ar, np.ones((m,))/m)[(m-1):] 

a = np.array([1, 3, 4, 5, 15, 14, 16, 13]) 
m = 2 
av = runningMean(a, m) 

d = a[m:] - av[:-m] 

In diesem Fall d enthält die gewünschte Ausgabe:

array([ 2. , 1.5, 10.5, 4. , 1.5, -2. ]) 
+0

@ Cleb Vielen Dank für Ihre Antwort, ich später erkannte, war es ein wenig verwirrend . Deshalb habe ich mein Beispiel geändert. – Mapa

+0

@Mapa: Ich habe die Antwort aktualisiert; lassen Sie mich wissen, ob das jetzt Ihre Frage beantwortet. – Cleb

+1

Ja, tut es. Vielen Dank. – Mapa

Verwandte Themen