2015-04-23 2 views
0

Alors que je suis sûr qu'il y a une réponse, et cette question est de très bas niveau (mais c'est toujours les choses faciles qui vous trébuchent), mon principal question est d'essayer de formuler la question.Réduire la taille d'un tableau en faisant la moyenne des points dans le tableau (IDL)

Dire que j'ai les tableaux suivants:

time=[0,1,2,3,4,5,6,7,8,9,10,11] ;in seconds 
data=[0,1,2,3,4,5,6,7,8,9,10,11] 

Le tableau « temps » est dans les bacs de « 1s », mais je voudrais le tableau comme dans les bacs de « 2s » où les données alors la moyenne:

time=[0,2,4,6,8,10] ;in seconds 
data=[0.5,2.5,4.5,6.5,8.5,10.5] 

Y at-il (et je suis sûr qu'il y a) une fonction IDL pour implémenter cela dans IDL? mon tableau de données réelles est:

DATA   DOUBLE = Array[15286473] 

donc je préfère utiliser un existant, efficace, solution que de créer inutilement la mienne.

Cheers, Paul

NB: Je peux changer le tableau de temps à ce que je veux en interpolant les données (INTERPOL)

IDL> x=[0,1,2,3,4,5,6,7,8,9,10] 
IDL> x_new=interpol(x,(n_elements(x)/2)+1.) 
IDL> print, x_new       
     0.00000  2.00000  4.00000  6.00000  8.00000  10.0000 

Le problème est seulement avec le tableau de données

Répondre

1

Je pense que vous avez besoin rebin: http://www.exelisvis.com/docs/REBIN.html

congrid fournit des fonctionnalités similaires. Si rebin ne résout pas votre problème, cela devrait fonctionner:

step = 2 
select = step * indgen(floor(n_elements/step)) 
new_time = (smooth(time, step))[select] 
new_data = (smooth(data, step))[select] 

Vous pouvez définir/edge_truncate pour lisse, en fonction de vos besoins. En outre, interpol ne travaillera pas pour vous?

+0

Je trouve interpol est très bien pour le tableau de temps - comme je ai juste besoin de l'heure à chaque 2ème point: IDL> x = [0,1,2,3,4,5,6,7,8, 9,10] IDL> x_new = interpol (x, (n_éléments (x)/2) +1.) IDL> print, x_new 0,00000 2,00000 4,00000 6,00000 8,00000 10.0000 mais ne voyait pas comment cela fonctionnerait pour les données qui vont être la moyenne. Je vais vérifier rebin! J'ai fini par faire du code semblable au tien mais c'est toujours agréable de connaître la routine en IDL pour le futur. –

+0

@PaulWright s'il vous plaît marquer cela comme la réponse acceptée si elle vous a aidé :) – VBB

0

Je peux penser à quelques façons de le faire, mais le plus facile serait le suivant:

nd = N_ELEMENTS(data) 
ind = LINDGEN(nd) 
upi = ind[1:(nd - 1L):2] 
dni = ind[0:(nd - 1L):2] 

où la forme d'indexation que j'ai utilisée est décrite here. On peut écrire un tableau comme ind[s0:s1:n]s0 est l'élément de départ, s1 est l'élément de fin, et n est le stride.

Maintenant que nous avons les indices pour les éléments de adjecent, alors nous pouvons définir les moyennes dans un format vectorisé comme:

avg_data = (data[upi] + [dni])/2 

Vous pouvez faire quelque chose de similaire à vos horodateurs ou utilisez INTERPOL si vous le souhaitez. Pour ce faire, il existe des méthodes plus compliquées (par exemple le trapezoid rule), mais ce qui précède est une solution simple et rapide.