用PyFITS编写布尔结构化数组

时间:2015-09-03 15:22:21

标签: fits pyfits

我想在FITS文件中使用PyFITS编写一个布尔结构化数组。 我有一些问题。这是一个简单的例子。

我创建测试字典并将其转换为结构化数组。

In [241]: test = {'p':np.array([True]*10+[False]*10,dtype='b')}
In [242]: test = np.core.records.fromarrays(list(test.values()), names=list(test.keys()))

这是我想在.fit文件中打印的测试结构化数组。

In [243]: test
Out[243]: 
rec.array([(1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (0,),
   (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,)], 
  dtype=[('p', 'i1')])

我使用pyfits在适合文件中打印测试

In [244]: pyfits.writeto('./test.fit',test,clobber=True)

In [245]: d = pyfits.open('./test.fit')

In [246]: d = d[1].data

但是,所有条目现在都设置为False值,如下所示:

In [247]: d  
Out[247]: 
FITS_rec([(False), (False), (False), (False), (False), (False), (False),
   (False), (False), (False), (False), (False), (False), (False),
   (False), (False), (False), (False), (False), (False)], 
  dtype=[('p', 'i1')])

此外,似乎原始测试数组也以某种方式被pyfits修改。

In [248]: prova
Out[248]: 
rec.array([(70,), (70,), (70,), (70,), (70,), (70,), (70,), (70,), (70,),
       (70,), (70,), (70,), (70,), (70,), (70,), (70,), (70,), (70,),
       (70,), (70,)], 
      dtype=[('p', 'i1')])

你能帮我解决一下这个问题吗?非常感谢你!

1 个答案:

答案 0 :(得分:1)

FITS中的布尔列很难理解,很大程度上是由于它们的异常表示(使用ASCII字符'T''F'来存储真值和假值,因此70你得到的是ASCII 'F' s。

尽管如此,我在过去做了很多工作才能使这项工作正常,所以即使你传入一个0和1的数组,它也应该推断你是什么意思是那个。这里似乎有一个错误,writeto"方便"函数没有正确处理boolean-ish数组。我能够让它像这样工作:

>>> hdu = fits.BinTableHDU.from_columns(test)
>>> hdu.writeto('test.fits', clobber=True)
>>> fits.getdata('test.fits')
FITS_rec([(True), (True), (True), (True), (True), (True), (True), (True),
       (True), (True), (False), (False), (False), (False), (False),
       (False), (False), (False), (False), (False)], 
      dtype=[('p', 'i1')])

你最初做的事情应该是有效的。虽然一般情况下我建议明确使用dtype='?'或等效dtype=bool,如果你想要将类型正确猜测为布尔值(否则你是否真的想要字节有些含糊不清)

更新:此处还有一个关于同一问题的旧错误报告:https://github.com/astropy/astropy/issues/1901显然我前一段时间试图解决这个问题但却厌倦了歧视。这很奇怪,因为我认为我确实在某一点上解决了这个问题...无论如何,如果你明确地使你的数组​​bool dtype并使用上面演示的.from_columns方法,它应该可以工作。我将看到重新审视其中的一些错误。