1

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 を使用して 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')])

この問題を解決するのを手伝ってくれませんか? どうもありがとうございました!

4

1 に答える 1

1

FITS のブール列は、主にその異常な表現 (ASCII 文字を使用し、真と偽の値を格納するために使用されるため、得られる ASCII である ) が原因で、よく理解されて'T''F'ませ70'F'

それにもかかわらず、私はこれを正しく機能させるために過去に多くの作業を行ってきたので、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='?'or と同等dtype=boolに明示的に使用することをお勧めします (そうしないと、実際にバイトが必要かどうかについてあいまいさがあります)。

更新:ここにも同じ問題に関する古いバグ レポートがあります: https://github.com/astropy/astropy/issues/1901 どうやら私は少し前にこれを解決しようとしましたが、あいまいさにうんざりしていました。ある時点でこれを修正したと思ったので、これは奇妙です...いずれにせよ、配列を明示的に bool dtype にして、.from_columns上記の方法を使用すると、動作するはずです。これらのバグのいくつかを再訪することについて見ていきます。

于 2015-09-03T19:52:58.380 に答える