Python FITS文件的大小在处理前后不同

Python FITS文件的大小在处理前后不同,python,pyfits,Python,Pyfits,处理后我的文件大小有问题…我编写了创建编辑图像的脚本…(从原始图像数据中扣除平场图像数据和暗图像数据)…这是代码,我的问题是…在Begining,我有大小为2.8MiB的fits文件,类型>2i…处理后,我有大小为11MiB的fits文件,类型为float64,我不知道为什么? IDL中有一些固定方法。在Python中,我使用imgg=imgg.astype(np.int16,copy=False) 有什么建议吗?来自 如果图像的标题包含可选BSCALE和/或BZERO关键字的非平凡值(即BSC

处理后我的文件大小有问题…我编写了创建编辑图像的脚本…(从原始图像数据中扣除平场图像数据和暗图像数据)…这是代码,我的问题是…在Begining,我有大小为2.8MiB的fits文件,类型>2i…处理后,我有大小为11MiB的fits文件,类型为float64,我不知道为什么? IDL中有一些固定方法。在Python中,我使用imgg=imgg.astype(np.int16,copy=False)

有什么建议吗?

来自

如果图像的标题包含可选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\u 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')

非常感谢……这就是我想要的