2015-09-03 108 views
1

我想用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

在FITS布爾列知之甚少,這在很大程度上是由於其不尋常的表現(使用ASCII字符'T''F'存儲真假值,因此70是你要得到,這是ASCII 'F'小號儘管如此,即使你傳遞了一個0和1的數組,它也應該推斷出你的意思,似乎是這樣的。這裏的一個錯誤,writeto「便利」功能沒有正確處理布爾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,如果您想要將類型正確地猜爲布爾值(否則對於您是否實際需要字節存在一些歧義)。

更新:還有大約同樣的問題在這裏的老bug報告:https://github.com/astropy/astropy/issues/1901顯然我想前一陣子來解決這一點,但厭倦了歧義。這很奇怪,因爲我認爲我確實在一點上修正了這個問題......無論如何,如果你明確地讓你的數組布爾型dtype,並使用上面演示的.from_columns方法,它應該可以工作。我會看到有關這些錯誤的重訪。