【问题标题】:Write boolean structured arrays with PyFITS使用 PyFITS 编写布尔结构化数组
【发布时间】:2015-09-04 04:06:01
【问题描述】:

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

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

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 在 fit 文件中打印测试

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')])

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

【问题讨论】:

    标签: fits pyfits


    【解决方案1】:

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

    尽管如此,我在过去做了大量工作以使其正常工作,因此即使您传入一个由 0 和 1 组成的数组,它也应该能推断出您的意思。这里似乎有一个错误,writeto“便利”函数没有正确处理布尔数组。我能够让它像这样工作:

    >>> 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 方法,它应该可以工作。我会重新审视其中的一些错误。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多