2016-01-19 25 views
5

Zastanawiam się, czy istnieje funkcja, która obliczałaby jednocześnie średnią kroczącą i łączyła ją z np.diff?Funkcja podobna do difpy numpy

Jeśli masz tablicę i obliczyć średnią dla ruchomego okna (średnia ruchoma) i obliczyć różnicę między tym średnim a następnym 1 elementem.

Przykład:

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] 

Jak wdrożyć go tak, że obliczenie czasu nie będzie tak długo, ponieważ chciałbym użyć go do tablicy 26000 elementów i wyższym m?

Odpowiedz

3

Edytuj 1: OP zaktualizował swoje pytanie po udzieleniu pierwszej odpowiedzi. Zaktualizowaną odpowiedź można znaleźć poniżej po EDIT2.

Nie wiem, co dokładnie próbujesz zrobić, ale w tym przypadku można po prostu wykonaj następujące czynności w celu uzyskania diff:

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

Następnie diff będzie sygnał wyjściowy:

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

Najpierw wycina się listy za pomocą parametru n, a następnie konwertuje listy na tablice i odejmuje je od siebie. Powyższy wiersz kodu byłby jeszcze prostszy, gdyby a) twoje listy miały tę samą długość, b) n był twoim indeksem, a nie elementem, od którego chcesz zacząć, oraz c) jeśli zamiast list użyto numpy tablic:

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 

Następnie diffAr wygląda następująco (jeden element więcej niż w przypadku odkąd dodaje jeden element do myArray):

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

tylko ogólne komentarz: Proszę nie używać array i diff jako nazw zmiennych.

EDIT2:

Zmieniłeś pytanie; tutaj jest teraz zaktualizowana odpowiedź. Jedyną rzeczą, którą należy dodać do powyższej odpowiedzi, jest sposób obliczenia średniej bieżącej z uwzględnieniem rozmiaru okna m. Po tym, co można zrobić dokładnie to, co zrobiłem powyżej:

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] 

W tym przypadku d zawiera pożądany wynik:

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

@ Cleb Dziękuję za odpowiedź, zdałem sobie sprawę później było nieco mylące . Dlatego zmieniłem swój przykład. – Mapa

+0

@Mapa: zaktualizowałem odpowiedź; daj mi znać, jeśli to teraz odpowie na twoje pytanie. – Cleb

+1

Tak, to prawda. Dziękuję Ci. – Mapa