http://docs.astropy.org/en/stable/io/fits/appendix/faq.html#why-is-an-image-containing-integer-data-being-converted-unexpectedly-to-floatsから
イメージのヘッダーに、オプションの BSCALE および/または BZERO キーワード (つまり、BSCALE != 1 および/または BZERO != 0) の重要な値が含まれている場合、ファイル内の生データを物理的なサイズに再スケーリングする必要があります。式による値:
physical_value = BZERO + BSCALE * array_value
BZERO と BSCALE は浮動小数点値であるため、結果の値も浮動小数点数でなければなりません。元の値が 16 ビット整数の場合、結果の値は単精度 (32 ビット) 浮動小数点数になります。元の値が 32 ビット整数の場合、結果の値は倍精度 (64 ビット浮動小数点) になります。
この自動スケーリングは、HDU のデータ部分にアクセスする (データを再スケーリングせずにヘッダーを更新するなどの処理を可能にする) までは行われないため、予期していない場合は簡単に油断してしまう可能性があります。例えば:
>>> hdul = fits.open('scaled.fits')
>>> image = hdul['SCI', 1]
>>> image.header['BITPIX']
32
>>> image.header['BSCALE']
2.0
>>> data = image.data # Read the data into memory
>>> data.dtype
dtype('float64') # Got float64 despite BITPIX = 32 (32-bit int)
>>> image.header['BITPIX'] # The BITPIX will automatically update too
-64
>>> 'BSCALE' in image.header # And the BSCALE keyword removed
False
これは、ユーザーがデータにアクセスすると、データを操作して計算を実行する可能性があるためです。データが整数のままであることを余儀なくされた場合、かなりの精度が失われます。したがって、最初は多少の混乱を招くという代償を払って、データを失わないという側で誤りを犯すのが最善です。
保存する前にデータを整数に戻す必要がある場合は、ImageHDU.scale メソッドを使用します。
>>> image.scale('int32')
>>> image.header['BITPIX']
32
または、mode='update' と scale_back=True 引数を指定してファイルを開くと、保存前に元の BSCALE および BZERO スケーリングがデータに自動的に再適用されます。通常、これは望ましくありません。特に、浮動小数点から符号なし整数値に変換する場合は特にそうです。ただし、これは、物理値の変化に対応して生データを変更する必要がある場合に役立ちます。
再スケーリングがまったく発生しないようにするには (ヘッダーを更新するのに適しています。コードがデータにアクセスするつもりがない場合でも、ここで注意を怠るのは良いことです)、ファイルを開くときに do_not_scale_image_data 引数を使用します。
>>> hdul = fits.open('scaled.fits', do_not_scale_image_data=True)
>>> image = hdul['SCI', 1]
>>> image.data.dtype
dtype('int32')