Astropy Fits:如何将切片行写入表格?

4
我目前正在处理一些fits表格,并在Astropy.io.fits中输出时遇到了麻烦。基本上,我正在切割一些包含我不感兴趣的对象数据的行,但是当我保存新表后,所有这些行都神奇地重新出现了。
例如:
import astropy.io.fits as fits
import numpy as np

hdu = fits.open('some_fits_file.fits')[1].data

sample_slice = [True True True False False True]

hdu_sliced = hdu[sample_slice]

现在我天真的想法是"hdu"有6行,"hdu_sliced"有4行,如果您使用np.size()函数,那就会得到这个结果。因此,如果我保存"hdu_sliced",新的fits文件也将有4行:

new_hdu = fits.BinTableHDU.from_columns(fits.ColDefs(hdu_sliced.columns))

new_hdu.writeto('new_fits_file.fits')

np.size(hdu3)
6

我使用的切片方法去除的两行在表格中并未被删除,最终生成的文件和原始文件没有任何区别。

请问如何在表格中删除不需要的行,并将新数据输出到新文件中?

谢谢, Ashley


type(hdu) == fits.fitsrec.FITS_rec 是吗? - Vlas Sokolov
是的,它是那种类型。 - AshleyNova
2个回答

4
你可以使用astropy.table.Table代替astropy.io.fits.BinTable吗?它是一种更加友好的表对象。从表中选择一行的一种方法是用想要的行的列表(或数组)对表对象进行索引:
>>> from astropy.table import Table
>>> table = Table()
>>> table['col_a'] = [1, 2, 3]
>>> table['col_b'] = ['spam', 'ham', 'jam']
>>> print(table)
col_a col_b
----- -----
    1  spam
    2   ham
    3   jam
>>> table[[0, 2]] # Table with rows 0 and 2 only, row 1 removed (a copy)
<Table length=2>
col_a col_b
int64  str4
----- -----
    1  spam
    3   jam

您可以使用 Table 直接读写 FITS 文件:

table = Table.read('file.fits', hdu='mydata')
table2 = table[[2, 7, 10]]
table2.write('file2.fits')

存在潜在问题,例如使用Table时无法保留FITS BINTABLE头信息,只能将键值信息存储在table.meta中。您可以查阅Astropy文档中关于表格和FITS BINTABLE的详细信息,了解这两种表格对象如何表示数据或如何在它们之间进行转换,或者在此处或astropy-dev邮件列表上提出后续问题。


-1

如果您想继续使用FITS_rec,可以尝试以下方法,这似乎是一种解决方法:

new_hdu = fits.BinTableHDU.from_columns(hdu_sliced._get_raw_data())

看起来好像已经完成了!谢谢你,真不想重新编写全部代码以使用astropy.table。 - AshleyNova
1
不要使用下划线开头的方法,因为它们可能会更改。它们仅供内部使用。有更好的方法。 - Iguananaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接