2013-05-24 12 views
6

Ho due array 1D, uno per i dati misurati e l'altro per la posizione. Ad esempio, i dati misurati possono essere la temperatura e l'altra matrice altezze della misurazione:Media intervallata dei dati 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 

Come si può vedere, l'altezza delle misurazioni non è distanziata regolarmente.

Voglio calcolare la temperatura media in intervalli di altezza regolarmente distanziati. Questa è una sorta di media mobile, ma la dimensione della finestra è variabile, perché i punti di dati all'interno dell'intervallo di interesse non sono sempre gli stessi.

questo potrebbe essere fatto con un ciclo for nel seguente modo:

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)) 

Non mi piace questo approccio che tanto e mi chiedevo se ci sarebbe stata una soluzione più "NumPy-style".

+0

vuoi una "media mobile" o "la temperatura media in intervalli regolarmente spaziati"? Cioè, se hai intervalli N, vuoi medie N o vuoi una media continua usando una finestra mobile (che copre un intervallo di altezze in ogni posizione)? – tom10

+0

Come ho detto nella mia commnet alla risposta di @elyase, probabilmente ho bisogno di prima di una media in intervalli regolari e poi lisciala con una spline. Tuttavia, una media mobile potrebbe anche essere buona in combinazione con una spline. –

risposta

3

Probabilmente stai cercando UnivariateSpline. Per esempio:

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) 

Ora è possibile valutare f dove vuoi:

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

Il 'f (regular_heights)' fornisce il valore interpolato in quei punti. Non è quello che ha chiesto l'OP - la media dei valori all'interno degli intervalli di altezza. – mg007

+0

So che ha menzionato il "cattivo" ma in un modo piuttosto vago (che significa di cosa?). Sembra che questo sia ciò che vuole veramente, ecco perché ho detto "probabilmente cercando ...". Se vuoi puoi pubblicare una risposta con la media, suppongo che alla fine scopriremo cosa sta cercando. – elyase

+0

'UnivariateSpline' sembra buono per i dati presi in un profilo verticale, tuttavia, nel mio caso, i dati sono presi simultaneamente in posizioni diverse i valori sono molto diversi. Forse la mia soluzione ha bisogno di una combinazione di entrambi gli approcci, prima una media per ottenere un set di dati con intervalli regolari e applicare una spline per ottenere una curva uniforme. –

Problemi correlati