2013-05-24 13 views
6

Mam dwie tablice 1D, jedną dla danych zmierzonych, a drugą dla lokalizacji. Na przykład, dane pomiarowe mogą być zdeterminowane temperaturą i drugą tablicę Wysokości pomiaru:Średnia z przedziału czasowego danych 1D

temp = np.asarray([10, 9.6, 9.3, ..., -20.3, -21.0]) # Temperature in celsius 
height = np.asarray([129, 145, 167, ..., 5043, 5112]) # Height in meters 

Jak widać, wysokość pomiarów nie jest w regularnych odstępach.

Chcę obliczyć średnią temperaturę w regularnie rozmieszczonych odstępach wysokości. Jest to pewnego rodzaju średnia ruchoma, ale rozmiar okna jest zmienny, ponieważ punkty danych w interwale zainteresowania nie zawsze są takie same.

Można to zrobić z pętli for w następujący sposób:

regular_heights = np.arange(0, 6000, 100) # Regular heights every 100m 
regular_temps = [] 

for i in range(len(regular_heights)-1): 
    mask = np.logical_and(height > regular_heights[i], height < regular_heights[i+1]) 
    mean = np.mean(temp[mask]) 
    regular_temps.append(mean) 

regular_temps = np.hstack((regular_temps)) 

nie podoba mi się takie podejście, że wiele, a ja zastanawiałem się, czy nie byłoby bardziej rozwiązanie „numpy-style”.

+0

Czy chcesz "Przenoszenie średni" lub "temp średnią w regularnych odstępach"? To znaczy, jeśli masz N interwałów, chcesz N średnich, czy chcesz ciągłej średniej za pomocą ruchomego okna (które obejmuje zakres wysokości w każdej lokalizacji)? – tom10

+0

Jak mówię w odpowiedzi na mój commnet do @elyase, prawdopodobnie potrzebuję najpierw średnika w regularnych odstępach, a następnie wygładzam go splajnem. Jednak średnia ruchoma może być również dobra w połączeniu z splajnem. –

Odpowiedz

3

Prawdopodobnie szukasz UnivariateSpline. Na przykład:

from scipy.interpolate import UnivariateSpline 

temp = np.asarray([10, 9.6, 9.3, 9.0, 8.7]) # Temperature in celsius 
height = np.asarray([129, 145, 167, 190, 213]) # Height in meters 
f = UnivariateSpline(height, temp) 

Teraz można ocenić f gdziekolwiek chcesz:

regular_heights = np.arange(120, 213, 5)  # Regular heights every 5m 
plot(height, temp, 'o', regular_heights, f(regular_heights), 'x') 

enter image description here

+1

'f (regular_heights)' daje wartość interpolacji w tych punktach. Nie tego, co zadawał OP - średnia wartości w odstępach wysokości. – mg007

+0

Wiem, że wspomniał o "podłym", ale w dość niejasny sposób (co z tego?). Wygląda na to, że właśnie tego chce, dlatego powiedziałem "prawdopodobnie szuka ...". Jeśli chcesz, możesz wysłać odpowiedź ze średnią, myślę, że dowiemy się, w końcu, co jest po. – elyase

+0

'UnivariateSpline'poprawnie dla danych pobranych w profilu pionowym, jednak w moim przypadku dane są pobierane jednocześnie w różnych lokalizacjach wartości są bardzo różne. Być może moje rozwiązanie wymaga kombinacji obu podejść, najpierw średniej, aby otrzymać regularnie rozłożony zestaw danych i zastosować splajn, aby uzyskać gładką krzywą. –

Powiązane problemy