使用 PyFITS 编写布尔结构化数组
Write boolean structured arrays with 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')])
你能帮我解决这个问题吗?非常感谢!
FITS 中的布尔列很少被理解,这在很大程度上是由于它们不寻常的表示(它使用 ASCII 字符 'T'
和 'F'
来存储真值和假值,因此 70
s 你得到的是 ASCII 'F'
s.
尽管如此,我过去做了很多工作来使这项工作正常进行,因此即使您传入一个 0 和 1 的数组,它也应该推断出您的意思。这里似乎有一个错误,writeto
"convenience" 函数没有正确处理布尔数组。我能够让它像这样工作:
>>> 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
方法,它应该可以工作。我会重新审视其中的一些错误。
我想在 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')])
你能帮我解决这个问题吗?非常感谢!
FITS 中的布尔列很少被理解,这在很大程度上是由于它们不寻常的表示(它使用 ASCII 字符 'T'
和 'F'
来存储真值和假值,因此 70
s 你得到的是 ASCII 'F'
s.
尽管如此,我过去做了很多工作来使这项工作正常进行,因此即使您传入一个 0 和 1 的数组,它也应该推断出您的意思。这里似乎有一个错误,writeto
"convenience" 函数没有正确处理布尔数组。我能够让它像这样工作:
>>> 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
方法,它应该可以工作。我会重新审视其中的一些错误。