2016-11-24 84 views
2

我目前正在使用一些适合表格,并且在输出Astropy.io.fits时遇到了问题。从本质上讲,我正在切出一大堆有我不感兴趣的对象数据的行,但是当我保存新表时,所有这些行都已经奇迹般的重现了。Astropy 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,新的千篇一律的文件也将有4列:

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

new_hdu.writeto('new_fits_file.fits') 

np.size(hdu3) 
6 

所以这两个行,我得到了与切片摆脱由于某种原因没有实际从表中删除和输出文件与原始文件相同。

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

干杯, 阿什利

+0

是'型(HDU)== fits.fitsrec.FITS_rec'? –

+0

是的,就是那种类型。 – AshleyNova

回答

-1

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

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

看起来好像已经完成了!感谢你,不希望重新设计所有我的代码来使用astropy.table。 – AshleyNova

+1

请勿使用以下划线开头的方法,因为它们可能会更改。它们仅供内部使用。有更好的方法。 – Iguananaut

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标题不会被保留,只有key,value info存储在table.meta中。您可以查阅表格和FITS BINTABLE上的Astropy文档,了解有关这两个表格对象的详细信息,它们如何表示数据或如何在两者之间进行转换,或者在此处或在astropy-dev邮件列表中提出后续问题。