关于python 3.x:Astropy适合:如何写出切成薄片的表?

Astropy Fits: How to write out a table with rows sliced out?

我目前正在使用一些fits表,但是在Astropy.io.fits中输出时遇到了麻烦。本质上,我正在切出一排包含我不感兴趣的对象的数据的行,但是当我保存新表时,所有这些行都神奇地重新出现了。

例如:

1
2
3
4
5
6
7
8
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行:

1
2
3
4
5
6
new_hdu = fits.BinTableHDU.from_columns(fits.ColDefs(hdu_sliced.columns))

new_hdu.writeto('new_fits_file.fits')

np.size(hdu3)
6

因此我出于某种原因而将切片切掉的那两行实际上并未从表中删除,并且输出的文件与原始文件相同。

如何从表中删除不需要的行,然后将新数据输出到新文件?

干杯,
阿什利


可以使用astropy.table.Table代替astropy.io.fits.BinTable吗?

这是一个更加友好的表对象。

进行行选择的一种方法是使用所需行的列表(或数组)索引到表对象中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> 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:

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

存在潜在的问题,例如使用Table时不保留FITS BINTABLE标头,只有键,值信息存储在table.meta中。您可以查询表和FITS BINTABLE上的Astropy文档,以获取有关两个表对象,它们如何表示数据或如何在两者之间进行转换的详细信息,或者仅在此处或在astropy-dev邮件列表中询问后续问题。<铅>


如果要坚持使用FITS_rec,可以尝试以下方法,这似乎是一种解决方法:

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