我对 FITS 文件执行了一个非常简单的操作(数据是 numpy 数组格式),但我无法让 astropy 将其保存为新文件或覆盖现有文件。
我正在重新编写一些使用 numpy pyfits 模块来处理天文 FITS 文件的旧代码 - 我想更新它以使用 astropy.io fit 模块。具体来说,我使用的一些数据是 3D 的,而一些是 4D 的。4D 的东西只是一个约定 - 第 4 轴不包含有用的信息(可以在此处找到数据示例:http ://www.mpia.de/THINGS/Data_files/NGC_628_NA_CUBE_THINGS.FITS )。所以我更喜欢删除额外的轴,然后我的其余代码可以继续进行而无需任何特殊要求。
这是我使用的基于 pyfits 的旧代码,效果很好:
import numpy
import pyfits
filename = 'NGC628.fits'
outfile = 'NGC628_reshaped.fits'
# Get the shape of the file
fitsfile=pyfits.open(filename)
image = fitsfile[0].data
header =fitsfile[0].header
z = image.shape[1] # No. channels
y = image.shape[2] # No. x pixels
x = image.shape[3] # No. y pixels
newimage = numpy.reshape(image,[z,y,x])
pyfits.core.writeto(outfile,newimage,header, clobber=True)
那里没有什么复杂的,它只是重塑一个数组并将其保存到一个新文件中。奇妙。现在我想用 astropy fit 模块替换它。如果我做 :
import numpy
from astropy.io import fits as pyfits
fitsfile = pyfits.open('NGC628.fits', mode='update')
image = fitsfile[0].data
header = fitsfile[0].header
z = image.shape[1]
y = image.shape[2]
x = image.shape[3]
image = numpy.reshape(image,[z,y,x])
......那么到目前为止,一切都很好。正如 image.shape 所证实的那样,“图像”数组的形状正确。但我终其一生都无法弄清楚如何将其保存到新的(或旧的)FITS 文件中。使用旧语法:
fitsfile.writeto('NGC628_2.fits',image,header)
...给出错误消息,“AttributeError:'numpy.ndarray'对象没有属性'lower'。如果相反,根据astropy文档,我只是省略图像和标题并尝试保存到原始文件:
fitsfile.writeto('NGC628.fits')
然后我得到一个文件已经存在的错误。如果我提供关键字“overwrite=True”,那么它会抱怨“WinError 32:该进程无法访问该文件,因为它正在被另一个进程使用:NGCC628.fits”。该文件绝对不会在任何其他程序中打开。
如果我指定新的文件名 NGC628_2.fits,那么 Python 会崩溃(将我返回到命令提示符)而没有错误。写入一个非常小的文件,其中仅包含标题数据,不包含任何图像数据。编辑:如果我使用正确的命令使用图像和标题数据编写新的 FITS 文件,则会发生完全相同的事情,例如 pyfits.writeto('NGC628_2.fits',image,header)。
只是为了让事情变得更加混乱,如果我做一个稍微简单的操作,比如说,将所有图像数据设置为一个常量值,然后关闭文件:
import numpy
from astropy.io import fits as pyfits
fitsfile = pyfits.open('NGC628.fits', mode='update')
image = fitsfile[0].data
header = fitsfile[0].header
image[:,:,:,:] = 5.0
fitsfile.close()
然后这工作 - 原始文件现在是一个数组,其中每个值都等于 5。我从 astropy 文档中收集到,只需在更新模式下打开文件并关闭它就足够了,在这种情况下就是这样。但是在重塑图像时,同样的技巧不起作用- FITS 文件没有改变。
那么我到底做错了什么?更新原始文件或保存到新文件都可以(最好是后者),但我无法让任一操作正常工作。
编辑:我有 Python 版本 3.5.3、numpy 版本 1.17.3、astropy 版本 3.2.3,并且我正在运行 Windows 10。