使用Astropy在FITS表中挑选一行

时间:2017-10-19 14:09:40

标签: python astronomy astropy idl-programming-language fits

我“只是”想要阅读(天文学)FITS表,并通过其名称选择一个对象的所有信息::

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

给出

if

尝试:

try:
    os.makedirs(dir_path)
except OSError as e:
    if e.errno != errno.EEXIS:
        raise
然后

给出一个数组原始FITS表文件的大小。这在IDL中是直截了当的。为什么在这里这么难?!?!

2 个答案:

答案 0 :(得分:5)

面具应该是布尔数组,对吧?

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

如果需要条件为真的整数数组,请使用np.nonzero或np.flatnonzero:

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

然后您应该可以使用它来索引数组:

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

我没有和你一样的quasar表,但是有没有机会这个名字不能以J开头?这似乎是我所拥有的dr7qso表的情况。

答案 1 :(得分:1)

另外,这个

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

如果是正确的比较,至少会给你一个包含所有匹配行的数组,分配给w。所以当你跑步时

print(tbdata[w])

您使用分配给tbdata的数组索引w(如果没有匹配则为空数组,如果匹配则可能为某些字符串)。因此IndexError。您需要的只是print(w)才能看到w是什么。

  

这在IDL中是直截了当的。为什么在这里这么难?!?!

真的不是。你只是在学习。在极少数情况下,我也有同样的感觉,我必须在IDL中做任何事情(我有空经验):)