【问题标题】:Picking out a single row in a FITS table with Astropy用 Astropy 在 FITS 表中挑选出一行
【发布时间】:2017-10-19 14:09:40
【问题描述】:

我“只是”想读入(天文学)FITS 表,并通过其名称挑选出一个物体的所有信息::

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 表文件大小的数组。这在 IDL 中是直截了当的。为什么这里这么难?!?!

【问题讨论】:

  • 为什么会被否决??!!

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


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

另外,这个

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

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

print(tbdata[w])

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2022-11-21
    • 2020-06-18
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    相关资源
    最近更新 更多