python pyfits
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python pyfits相关的知识,希望对你有一定的参考价值。
原链接:http://blog.sina.com.cn/s/blog_a046022d0101a48h.html,全文复制以备出错。
导入pyfits模块:import pyfits
(1)打开fits文件:
hdulist = pyfits.open( ‘/home/huang/test.fits‘ )
(2)查看fits里面存了什么:
一个fits文件至少包含一个主头文件,可以有也可以没有扩展头。主头存任意维数组(不能存字符),扩展头存表格(table,表格形式任意,可存字符、数字等,例如存星表)。
hdulist.info()
No. Name Type Cards Dimensions Format
0 PRIMARY PrimaryHDU 7 () int32
1 BinTableHDU 26 3072R x 1C [1024E]
(3)查看数据描述,即header:
不同的头有不同的header,
看[0]PrimaryHDU的header:
hdulist[0].header.items()
看[1]BinTableHDU的header(用healpix Haslam图作例子):
hdulist[1].header.items()
得到结果如:
[(‘XTENSION‘, ‘BINTABLE‘),
(‘BITPIX‘, 8),
(‘NAXIS‘, 2),
(‘NAXIS1‘, 8),
(‘NAXIS2‘, 3145728),
(‘PCOUNT‘, 0),
(‘GCOUNT‘, 1),
(‘TFIELDS‘, 2),
(‘TTYPE1‘, ‘TEMPERATURE‘),
(‘TFORM1‘, ‘E‘),
(‘TUNIT1‘, ‘K‘),
(‘TTYPE2‘, ‘N_OBS‘),
(‘TFORM2‘, ‘E‘),
(‘TUNIT2‘, ‘counts‘),
(‘EXTNAME‘, ‘ARCHIVE MAP TABLE‘),
(‘DATE‘, ‘2003-02-05T00:00:00‘),
(‘PIXTYPE‘, ‘HEALPIX‘),
(‘ORDERING‘, ‘NESTED‘),
(‘NSIDE‘, 512),
(‘FIRSTPIX‘, 0),
(‘LASTPIX‘, 3145727)]
可看到,hdulist[1]储存的是temperature,单位是K,healpix类型为nested,nside=512共3145728像素。
(4)取fits数据:
fits数据有两种,一是数组(数字)数据,二是table数据。两者都用同一个函数 .data (注意不是.data(),没有())
取数组数据:data1 = hdulist[0].data
取table数据:data2 = hdulist[1].data
(5)修改header
先取出header:
hdr = hdulist[1].header
(这里的hdr与hdulist共用地址,因此hdr变了hdulist也跟着变。而hdulist[1].header.items()只用来显示)
1、修改header的值(下面添加header的.set()也能修改值):
header取值可用keyword和序号取,如(3)所示的header,要取得(‘PIXTYPE‘, ‘HEALPIX‘)有两种方法:
keyword:hdr[‘PIXTYPE‘](注意,在header中,字母不分大小写)
序号:hdr[-5]或hdr[16]
现在hdr[‘PIXTYPE‘]的值为’HEALPIX‘,改为’test‘:
hdr[‘PIXTYPE‘] = ‘test‘
2、添加header:
hdr.append和hdr.insert都可以添加header,但它们功能很少且可以添加重复的keyword造成混乱。
添加和修改header最好用 .set()
1.修改header的值,如果keyword不存在则在末尾创建:
例如修改(‘PIXTYPE‘, ‘HEALPIX‘)的值:
hdr.set(‘PIXTYPE‘, ‘test‘)
如果keyword不小心错写成’PAXTYPE’,则会在原header末尾创建(‘PAXTYPE‘, ‘test‘)
2.在某个keyword前后添加:
hdr.set(‘en‘, ‘haha‘, before=‘PIXTYPE‘)
在’PIXTYPE’前面添加(‘en‘,‘haha‘)
在后面添加则为
hdr.set(‘en‘, ‘haha‘, after=‘PIXTYPE‘)
另外,before和after=可以为序号如before=10
3.header除了keyword和值之后,还可有“解释”,其实set的完整命令为:
一、set( 原keyword, 新值, 解释 )
hdr.set(‘PIXTYPE‘, ‘test‘, ‘explain this header‘)
二、set( 新keyword, 新值, 解释, after=原keyword )
hdr.set( ‘add‘, ‘new‘, ‘this is a new header‘, after=‘PIXTYPE‘ )
解释可有可无。
注意,set不可以新建重复已存在的keyword。
3、删除header:
del hdr[‘PIXTYPE‘] 或 del hdr[16]
删除一段:del hdr[5:10]
把del放前面。
(6)保存修改:
hdulist.writeto( ‘new_name.fits‘ )
注意,保存的文件名要是新名字,如果当前文件夹下已经有相同文件名存在,则出错而不能保存。
(7)保存任意维数组数据(不含字符):
1、A是要储存的N维数组
2、Create a PrimaryHDU object to encapsulate the data:
hdu = pyfits.PrimaryHDU(A)
3(1)、Then create a HDUList to contain the newly created primary HDU:
hdulist = pyfits.HDUList([hdu])
hdulist.writeto(’A.fits’)
3(2)、pyfits提供一个合并步骤处理上面的3(1)的两步(3(2)和3(1)是完全等价的)
hdu.writeto(’A.fits’)
(8)将table保存为FITS文件:
用以下的例子来说明:
table以“列”为单位,下面的table有3列,第一列是字符(名称),第二列是数字(值)
a1 = np.array([‘NGC1001‘, ‘NGC1002‘, ‘NGC1003‘])
a2 = np.array([11.1, 12.3, 15.2])
a3 = np.array([250, 213, 36])
col1 = pyfits.Column(name=‘source‘, format=‘20A‘, array=a1)
col2 = pyfits.Column(name=‘V_magitude‘, format=‘E‘, array=a2)
col3 = pyfits.Column(name=‘random_number‘, format=‘I‘, array=a3)
cols = pyfits.ColDefs([col1,col2,col3])
# 就算只有一列,也可写 []:cols = pyfits.ColDefs([col1])
# 选择2是新方法;选择1是旧方法,在新版本中可能会去掉
选择1:tbhdu = pyfits.TableHDU.from_columns(cols)
选择2:tbhdu = pyfits.new_table(cols)
tbhdu.writeto(‘outname.fits‘)
Column函数:
pyfits.Column(name, format, unit, null, bscale, bzero, disp, start, dim, array, ascii)
全部参数的默认值都是None。
参数名对应header的keyword为:
name -> column name, TTYPE
format -> value format, TFORM
unit -> TUNIT
null -> null value, TNULL
scale -> bscale value, TSCAL
bzero -> bzero value, TZERO
dis -> display format, TDISP
start -> column starting position (ASCII table only), TBCOL
dim -> dimension, TDIM
(9)有效储存format
以上是关于python pyfits的主要内容,如果未能解决你的问题,请参考以下文章