2017-10-19 4 views
-2

I « simplement » veux lire dans un (Astronomie) FITS table, et prendre toutes les informations sur un objet via son nom ::Sélectionnant une seule rangée dans une FITS table avec Astropy

from astropy.io import fits 
dr7q = fits.open('Shen_dr7_bh_May_2010.fits') 
tbdata = dr7q[1].data 
w = tbdata[tbdata['SDSS_NAME'] == 'J000006.53+003055.2'] 

print(tbdata[w]) 

donne un

IndexError: arrays used as indices must be of integer (or boolean) type 

Essayer:

mask = (tbdata['SDSS_NAME'] == 'J000006.53+003055.2') 
print(mask) 

donne alors un tableau de la taille du fichier de table FITS d'origine. C'est simple dans IDL. Pourquoi est-ce si difficile ici?!?!

+0

Pourquoi cela a-t-il été rejeté? !! – npross

Répondre

5

Le masque doit être un tableau de booléens, non?

>>> tbdata['sdssj'] == '000006.53+003055.2' 
array([True, False, False, ..., False, False, False], dtype=bool) 

Si vous voulez un tableau des entiers où la condition est vraie, utilisez np.nonzero ou np.flatnonzero:

>>> np.flatnonzero(tbdata['sdssj'] == '000006.53+003055.2') 
array([0]) 

que vous devriez alors être en mesure d'utiliser pour indexer le tableau:

>>> T[T['sdssj'] == '000006.53+003055.2'] 
FITS_rec([ ('000006.53+003055.2', 0.027227999999999999, 0.51534100000000005, 1.8246, 20.384, 0.065000000000000002, 20.460999999999999, 0.034000000000000002, 20.324000000000002, 0.037999999999999999, 20.093, 0.041000000000000002, 20.042000000000002, 0.121, 0.13, 20.507999999999999, 0.0, 0.0, 0.0, -9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, -25.109000000000002, 0.090999999999999998, 0, 0, 1, 0, 34603008, 0, 0, 0, 0, 1, 0, 0, 3325, 52522, 52203, 685, 467, 41, 5, 108, 118, 34603008, 0, 0, 0, 0, 1, 0, 0, 20.384, 0.065000000000000002, 20.460999999999999, 0.034000000000000002, 20.324000000000002, 0.037999999999999999, 20.093, 0.041000000000000002, 20.042000000000002, 0.121, '588015509806252150', '193034571183292416', ' SDSS J000006.53+003055.2')], 
     dtype=(numpy.record, [('SDSSJ', 'S31'), ('RA', '>f8'), ('DEC', '>f8'), ('z', '>f8'), ('UMAG', '>f8'), ('UMAGERR', '>f8'), ('GMAG', '>f8'), ('GMAGERR', '>f8'), ('RMAG', '>f8'), ('RMAGERR', '>f8'), ('IMAG', '>f8'), ('IMAGERR', '>f8'), ('ZMAG', '>f8'), ('ZMAGERR', '>f8'), ('AU', '>f8'), ('logNH', '>f8'), ('FIRSTMAG', '>f8'), ('FIRSTSN', '>f8'), ('FIRSTDEL', '>f8'), ('RASSCNT', '>f8'), ('RASSSN', '>f8'), ('RASSDEL', '>f8'), ('JMAG', '>f8'), ('JMAGERR', '>f8'), ('HMAG', '>f8'), ('HMAGERR', '>f8'), ('KMAG', '>f8'), ('KMAGERR', '>f8'), ('MASSDEL', '>f8'), ('MASSFLG', '>i4'), ('MIMAG', '>f8'), ('DGMI', '>f8'), ('MFLAG', '>i4'), ('SPFLAG', '>i4'), ('MODEFLAG', '>i4'), ('USELFLAG', '>i4'), ('BESTFLAG', '>i4'), ('LZFLAG', '>i4'), ('HZFLAG', '>i4'), ('FTFLAG', '>i4'), ('RTFLAG', '>i4'), ('SRFLAG', '>i4'), ('STFLAG', '>i4'), ('GXFLAG', '>i4'), ('RUN', '>i4'), ('RMJD', '>i4'), ('SMJD', '>i4'), ('PLATE', '>i4'), ('FIBER', '>i4'), ('RERUN', '>i4'), ('CAMCOL', '>i4'), ('FIELD', '>i4'), ('OBJECT', '>i4'), ('TFLAG', '>i4'), ('LZTFLAG', '>i4'), ('HZTFLAG', '>i4'), ('FTTFLAG', '>i4'), ('RTTFLAG', '>i4'), ('SRTFLAG', '>i4'), ('STTFLAG', '>i4'), ('GXTFLAG', '>i4'), ('UTMAG', '>f8'), ('UTMAGERR', '>f8'), ('GTMAG', '>f8'), ('GTMAGERR', '>f8'), ('RTMAG', '>f8'), ('RTMAGERR', '>f8'), ('ITMAG', '>f8'), ('ITMAGERR', '>f8'), ('ZTMAG', '>f8'), ('ZTMAGERR', '>f8'), ('BESTID', 'S31'), ('SPECOID', 'S31'), ('ONAME', 'S31')])) 

Je n'ai pas la même table que vous quasar, mais est-il possible que le nom ne commence pas par un J? Cela semble être le cas pour la table dr7qso que j'ai.

+0

Aye !! Pensez que embêtant leader "J" causait des problèmes !! https://www.youtube.com/watch?v=yj3DBcpfMNQ – npross

1

De plus, cette

w = tbdata[tbdata['SDSS_NAME'] == 'J000006.53+003055.2'] 

avait-il été la comparaison correcte, au moins, auriez-vous donné un tableau de toutes les lignes de correspondance, attribué à w. Alors, quand vous avez exécuté

print(tbdata[w]) 

Vous indexé tbdata à l'aide du tableau attribué à w (soit un tableau vide s'il n'y a aucun résultat, ou probablement quelques cordes s'il y avait des matchs). D'où le IndexError. Tout ce dont vous aviez besoin était print(w) pour voir ce que w était.

Ceci est simple dans IDL. Pourquoi est-ce si difficile ici?!?!

Ce n'est vraiment pas le cas. Vous êtes en train d'apprendre. Je ressens la même chose dans les rares cas où je dois faire quelque chose en IDL (avec lequel j'ai une expérience nulle) :)