2013-05-24 4 views
6

J'ai deux matrices 1D, une pour les données mesurées et l'autre pour l'emplacement. Par exemple, les données de mesure peuvent être la température et l'autre tableau les hauteurs de la mesure:Moyenne d'intervalle des données 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 

Comme vous pouvez le voir, la hauteur des mesures ne sont pas régulièrement espacées.

Je souhaite calculer la température moyenne dans des intervalles de hauteur régulièrement espacés. C'est une sorte de moyenne mobile, mais la taille de la fenêtre est variable, car les points de données dans l'intervalle d'intérêt ne sont pas toujours les mêmes.

Cela pourrait se faire avec une boucle de la manière suivante:

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

Je n'aime pas cette approche beaucoup et je me demandais s'il y aurait une solution plus « style numpy ».

+0

Voulez-vous un « moyenne mobile » ou « la température moyenne dans des intervalles réguliers »? C'est-à-dire, si vous avez N intervalles, vous voulez N moyennes, ou voulez-vous une moyenne continue en utilisant une fenêtre mobile (qui couvre une gamme de hauteurs à chaque emplacement)? – tom10

+0

Comme je le dis dans ma réponse de commnet à @elyase, j'ai probablement besoin de di d'abord une moyenne dans des intervalles régulièrement espacés et puis lisser avec une spline. Cependant, une moyenne mobile pourrait aussi être bonne en combinaison avec une spline. –

Répondre

3

Vous êtes probablement à la recherche de UnivariateSpline. Par exemple:

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) 

Maintenant vous pouvez évaluer f où vous voulez:

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

Le 'f (regular_heights)' donne une valeur interpolée à ces points. Pas ce que OP a demandé - la moyenne des valeurs dans les intervalles de hauteur. – mg007

+0

Je sais qu'il a mentionné le «moyen» mais d'une manière plutôt vague (moyen de quoi?). On dirait que c'est ce qu'il veut vraiment, c'est pourquoi j'ai dit 'probablement à la recherche de ...'. Si vous voulez, vous pouvez poster une réponse avec la moyenne, je suppose que nous découvrirons finalement ce qu'il cherche après. – elyase

+0

'UnivariateSpline' semble très bien pour les données prises dans un profil vertical, cependant, dans mon cas, les données sont prises simultanément à des endroits différents, les valeurs sont très différentes. Peut-être que ma solution nécessite une combinaison des deux approches, d'abord une moyenne pour obtenir un ensemble de données régulièrement espacées et l'application d'une spline pour obtenir une courbe régulière. –

Questions connexes