首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python将fits表写入输出LDAC fits目录

如何使用Python将fits表写入输出LDAC fits目录
EN

Stack Overflow用户
提问于 2015-09-24 21:24:25
回答 1查看 789关注 0票数 2

我有一个LDAC适合目录,在代码中,我需要将两个数组的元素作为两个新列添加到其中。

我在python中打开了原始目录:

代码语言:javascript
复制
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

这两个数组已经就绪,名为radec。我给他们的关键名称,格式和其他需要的信息,并将他们倒置到列。最后,我将两个新列连接到原始表(检查newtab.columnsnewtab.data显示新列已成功附加)。

代码语言:javascript
复制
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)

当我将新表保存到新目录中时:

代码语言:javascript
复制
newtab.writeto('newcatalog.cat')

这不是我需要的格式。如果我查看每个目录的描述

代码语言:javascript
复制
ldacdes -i 

我看到了catalog.cat:

代码语言:javascript
复制
> 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

对于新的那个:

代码语言:javascript
复制
> 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中。

是否有任何解决方案来控制输出符合目录格式?

谢谢你的帮助,我希望我能把关于堆叠溢出的第一个问题恰当地组织起来。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-28 12:58:31

我不知道具体的LDAC格式,但从您的示例文件catalog.cat看来,它似乎是一个多扩展名的FITS文件。也就是说,每个表都存储在单独的HDU中(对于包含具有不同列集的多个表的任何文件来说,这都是典型的)。

当你做这样的事情

代码语言:javascript
复制
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的索引),并将其写入文件:

代码语言:javascript
复制
 hdulist = fits.open(cat1)
 hdulist['OBJECTS'] = newtab
 hdulist.writeto('newcatalog.cat')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32771170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档