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 |
您可以直接使用
1 2 3 | table = Table.read('file.fits', hdu='mydata') table2 = table[[2, 7, 10]] table2.write('file2.fits') |
存在潜在的问题,例如使用
如果要坚持使用
1 | new_hdu = fits.BinTableHDU.from_columns(hdu_sliced._get_raw_data()) |