Python 保存在同一.fits文件中的多个表

Python 保存在同一.fits文件中的多个表,python,astropy,fits,pyfits,Python,Astropy,Fits,Pyfits,我使用astropy.table.table创建了多个表,例如: from astropy.table import Table import numpy as np #table 1 ta=Table() ta["test1"]=np.arange(0,100.) #table 2 tb=Table() tb["test2"]=np.arange(0,100.) 我可以使用将它们单独保存到.fits文件中 ta.write('table1.fits') tb.write('t

我使用
astropy.table.table
创建了多个表,例如:

 from astropy.table import Table
 import numpy as np
 #table 1
 ta=Table()
 ta["test1"]=np.arange(0,100.)
 #table 2
 tb=Table()
 tb["test2"]=np.arange(0,100.)
我可以使用将它们单独保存到
.fits
文件中

ta.write('table1.fits')
tb.write('table2.fits')

但是我想将它们保存到相同的
.fits
文件中,每个文件都使用不同的
hdu
。我怎样才能做到这一点呢?

这里有一个例子说明了如何做到这一点。因此,您可以执行以下操作:

import numpy as np
from astropy.io import fits

ta = Table()
ta['test1'] = np.arange(0, 100.)
col1 = fits.Column(name=ta.colnames[0], format='E', array=ta)

tb = Table()
tb['test2'] = np.arange(0, 100.)
col2 = fits.Column(name=tb.colnames[0], format='E', array=tb)

cols = fits.ColDefs([col1, col2])

hdu = fits.BinTableHDU.from_columns(cols)
hdu.writeto('table.fits')
它只有一个二进制表HDU,但有两列。或者,要将它们作为单独的HDU添加,您可以执行以下操作

ta = Table()
ta['test1'] = np.arange(0, 100.)
col1 = fits.Column(name=ta.colnames[0], format='E', array=ta)

hdu1 = fits.BinTableHDU.from_columns(fits.ColDefs([col1]))

tb = Table()
tb['test2'] = np.arange(0, 100.)
col2 = fits.Column(name=tb.colnames[0], format='E', array=tb)

hdu2 = fits.BinTableHDU.from_columns(fits.ColDefs([col2]))

# create a header
hdr = fits.Header()
hdr['Author'] = 'Me'
primary_hdu = fits.PrimaryHDU(header=hdr)

# put all the HDUs together
hdul = fits.HDUList([primary_hdu, hdu1, hdu2])

# write it out
hdul.writeto('table.fits')

有一个效用函数

如果有两个表对象
ta
tb
,则继续您的示例:

from astropy.io import fits
hdu_list = fits.HDUList([
    fits.PrimaryHDU(),
    fits.table_to_hdu(ta),
    fits.table_to_hdu(tb), 
])
hdu_list.writeto('tables.fits')

但本例创建了一个
.fits
表,其中包括作为同一表一部分的两个表。即使在我的简化示例中,我给出了一列两个表的示例,但基于简单的一列构建一个两列的表并不是我想要的。正如我在问题中所说,我想构建一个
.fits
文件,每个表都在一个hdu中。@JuliaRoquette-我编辑了答案,希望能满足您的要求。编辑的答案有帮助吗?编辑的答案有帮助,是。但是有一个小的拼写错误:我检查了pyfits,模块的正确名称是
ColDefs
,而不是你写的
ColsDef
。@Christoph的解决方案比我的稍微简洁,因此,我建议您也不一定需要所有这些内容:
hdu1=fits.BinTableHDU.from_columns(fits.ColDefs([col1])
fits表结构的许多手动构造可以通过使用来简化,因为
BinTableHDU.from_columns
接受多字段Numpy数组。所以
BinTableHDU.from_columns(table.as_array())
在这里起作用(我想这就是
table_to_hdu()
主要做的事情)。