我有一个LDAC适合目录,在代码中,我需要将两个数组的元素作为两个新列添加到其中。
我在python中打开了原始目录:
from astropy.io import fits
from astropy.table import Table
import astromatic_wrapper as aw
cat1='catalog.cat'
hdulist1 =fits.open(cat1)
data1=hdulist1[1].data这两个数组已经就绪,名为ra和dec。我给他们的关键名称,格式和其他需要的信息,并将他们倒置到列。最后,我将两个新列连接到原始表(检查newtab.columns和newtab.data显示新列已成功附加)。
racol=fits.Column(name = 'ALPHA_J2000', format = '1D', unit = 'deg', disp = 'F11.7',array=ra)
deccol=fits.Column(name = 'DELTA_J2000', format = '1D', unit = 'deg', disp = 'F11.7',array=dec)
cols = fits.ColDefs([racol, deccol])
tbhdu = fits.BinTableHDU.from_columns(cols)
orig_cols= data1.columns
newtab = fits.BinTableHDU.from_columns(cols + orig_cols)当我将新表保存到新目录中时:
newtab.writeto('newcatalog.cat')这不是我需要的格式。如果我查看每个目录的描述
ldacdes -i 我看到了catalog.cat:
> Reading catalog(s)
------------------Catalog information----------------
Filename:..............catalog.cat
Number of segments:....3
****** Table #1
Extension type:.........(Primary HDU)
Extension name:.........
****** Table #2
Extension type:.........BINTABLE
Extension name:.........OBJECTS
Number of dimensions:...2
Number of elements:.....24960
Number of data fields...23
Body size:..............4442880 bytes
****** Table #3
Extension type:.........BINTABLE
Extension name:.........FIELDS
Number of dimensions:...2
Number of elements:.....1
Number of data fields...4
Body size:..............28 bytes
> All done对于新的那个:
> Reading catalog(s)
------------------Catalog information----------------
Filename:..............newcatalog.cat
Number of segments:....2
****** Table #1
Extension type:.........(Primary HDU)
Extension name:.........
****** Table #2
Extension type:.........BINTABLE
Extension name:.........
Number of dimensions:...2
Number of elements:.....24960
Number of data fields...25
Body size:..............4842240 bytes
> All done如上所述,在原始目录catalog.cat中有三个表,我尝试向OBJECTS表中添加两列。
我需要newcatalog.cat也保持其他程序所需的相同结构,但是它没有对象表,并且考虑到“元素数”和“数据字段数”,新选项卡被保存到表2中。
是否有任何解决方案来控制输出符合目录格式?
谢谢你的帮助,我希望我能把关于堆叠溢出的第一个问题恰当地组织起来。
发布于 2015-09-28 12:58:31
我不知道具体的LDAC格式,但从您的示例文件catalog.cat看来,它似乎是一个多扩展名的FITS文件。也就是说,每个表都存储在单独的HDU中(对于包含具有不同列集的多个表的任何文件来说,这都是典型的)。
当你做这样的事情
newtab = fits.BinTableHDU.from_columns(cols + orig_cols)
newtab.writeto('newcatalog.cat')您只是创建一个新的二进制表HDU,并将该HDU单独写入一个文件(以及强制的主HDU)。您真正想要的是采用与原始文件相同的HDU结构,并将现有的表HDU替换为添加了新列的表HDU。
创建多扩展适合是一些这里的讨论,但您甚至不需要从头开始重新创建完整的HDU结构。从HDUList返回的fits.open对象只是一个HDU列表,可以像普通的fits.open列表那样操作它们(例如,为了支持EXTNAME的索引),并将其写入文件:
hdulist = fits.open(cat1)
hdulist['OBJECTS'] = newtab
hdulist.writeto('newcatalog.cat')https://stackoverflow.com/questions/32771170
复制相似问题