使用 Astropy 在 FITS table 中挑选出一行

Picking out a single row in a FITS table with Astropy

我"simply"想读入一个(天文学)FITS table,并通过它的名字找出一个物体的所有信息::

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

给出一个

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

正在尝试:

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

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

掩码应该是一个布尔数组,对吧?

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

我没有和你一样的类星体 table,但是这个名字有没有可能不以 J 开头?我拥有的 dr7qso table 似乎就是这种情况。

另外,这个

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

如果比较正确,至少会为您提供一个包含所有匹配行的数组,并分配给 w。所以当你 运行

print(tbdata[w])

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

This is straight-forward in IDL. Why's it so hard here?!?!

事实并非如此。你只是在学习。在极少数情况下,我有同样的感觉,我必须在 IDL 中做任何事情(我没有任何经验):)