2013-07-02 5 views
1

Je cherchais une réponse depuis hier mais pas de chance. J'ai donc un fichier spectre 1D (.fits) avec valeur de flux à chaque longueur d'onde. Je les ai convertis en un tableau 2D (x, y) = (longueur d'onde, flux) et je veux écrire un programme qui retournera le flux (y) à certaines longueurs d'onde assignées (x). J'ai essayé ceci:Python 2D array - Comment brancher x et récupérer y valeur?

#modules 
import scipy 
import numpy as np 
import pyfits as pf 

#Target Global Vaiables 
hdulist_tg = pf.open('cutmask1-2.0001.fits')  
hdr_tg = hdulist_tg[0].header 
flux_tg = hdulist_tg[0].data 
crval_tg = hdr_tg['CRVAL1']    #Starting wavelength 
cdel_tg = hdr_tg['CDELT1']    #Wavelength axis width 
wave_tg = crval_tg + np.arange(3183)*cdel_tg  #Create an x-axis 
wavelist = [6207,6315,6369,6438,6490,6565,6588] 

wave_flux=[] 
diff = 10 
for wave in wave_tg: 
    for flux in flux_tg: 
     wave_flux.append((wave,flux))   

for item in wave_flux: 
    wave = item[0] 
    flux = item[1] 

#Where I got my actual wavelength that exists in wave_tg 
    diffmatch = np.abs(wave - wavelist[0]) 
    if diffmatch < diff: 
     flux_wave = flux 
     diff = diffmatch 
     wavematch = wave 

print wavelist[0],flux_wave,wavematch 

mais le programme retourne toujours la même valeur de flux même si la longueur d'onde est différente. S'il vous plaît aider ...

+0

pourriez-vous fournir un lien vers le fichier 'cutmask1-2.0001.fits'? –

+0

Vous êtes ici http://www.filedropper.com/cutmask1-20001 –

Répondre

1

Je sauterais la création de la table deux dimensions tout à fait et il suffit d'utiliser interp:

fluxvalues = np.interp(wavelist, wave_tg, flux_tg) 

Pour le fichier que vous avez publié, le code affiché ne travailler en raison de la longueur codée en dur du tableau wave_tg. Je voudrais donc vous recommandons d'utiliser plutôt

wave_tg = crval_tg + np.arange(len(flux_tg))*cdel_tg 

En outre, pour une raison quelconque, il semble que le fichier que vous avez publié ne va pas réellement aux longueurs d'onde que l'on recherche. Vous devrez peut-être vérifier que vous calculez correctement les longueurs d'onde correspondantes ou vérifiez que vous recherchez les bonnes longueurs d'onde.

+0

Maintenant que vous avez mentionné, vous avez peut-être raison. Parce que le fichier que j'ai posté est celui que je coupe seulement la portion de longueur d'onde dont j'ai besoin pour que l'axe soit plus court. Je vous remercie! –

1

J'ai fait quelques changements dans votre code:

  • utilisant numpy ot créer wave_flux comme ndarray utilisant np.hstack(), np.repeat() et np.tile()

  • utilisant FancyIndexing pour obtenir les valeurs correspondant à votre recherche

Le résultat de est:

#modules 
import scipy 
import numpy as np 
import pyfits as pf 

#Target Global Vaiables 
hdulist_tg = pf.open('cutmask1-2.0001.fits') 
hdr_tg = hdulist_tg[0].header 
flux_tg = hdulist_tg[0].data 
crval_tg = hdr_tg['CRVAL1']    #Starting wavelength 
cdel_tg = hdr_tg['CDELT1']    #Wavelength axis width 
wave_tg = crval_tg + np.arange(3183)*cdel_tg  #Create an x-axis 
wavelist = [6207,6315,6369,6438,6490,6565,6588] 

wave_flux = np.vstack((np.repeat(wave_tg, len(flux_tg)), 
         np.tile(flux_tg, len(wave_tg)))).transpose() 

wave_ref = wavelist[0] 
diff = 10 

print wave_flux[ np.abs(wave_flux[:,0]-wave_ref) < diff ] 

qui retournera un sous-groupe de wave_flux avec les valeurs d'onde dans la colonne 0 et les valeurs de flux dans la colonne 1:

[[ 6197.10300138 500.21020508] 
[ 6197.10300138 523.24102783] 
[ 6197.10300138 510.6390686 ] 
..., 
[ 6216.68436446 674.94732666] 
[ 6216.68436446 684.74255371] 
[ 6216.68436446 712.20098877]] 
+0

Merci beaucoup. J'ai une question - Comment une valeur de longueur d'onde peut-elle retourner autant de flux? –

+0

Dans la construction de 'wave_flux', chaque valeur de' wave_tg' aura tous les flux dans 'flux_tg'. Le sous-groupe renvoie toutes les vagues correspondant à votre critère. Je ne suis pas techniquement familier avec votre sujet, donc je ne sais pas si, physiquement, une longueur d'onde peut avoir plus d'un flux ... –

+0

Ou est-ce que tout le nombre décimal n'est pas imprimé dans la colonne 0? D'ailleurs, votre code est vraiment soigné. Agréable et propre. Merci encore! –