我正在重写一些旧代码,该代码使用numpy pyfits模块处理天文FITS文件 - 我想更新它以使用astropy.io fits模块。具体来说,我处理的某些数据是3D的,而另一些则是4D的。 4D的东西只是一种约定 - 第四个轴不包含任何有用的信息(可以在此处找到数据示例:http://www.mpia.de/THINGS/Data_files/NGC_628_NA_CUBE_THINGS.FITS)。所以我更喜欢删除额外的轴,然后我的余下的代码就不需要任何特殊的要求了。
这是我用的旧pyfits-based代码,它完全正常:
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 fits模块来替换它。如果我执行以下操作:
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"数组已经正确地被重塑,如image.shape所证实。但我无法想象如何将其保存到新的(或旧的)FITS文件中。使用旧语法:
fitsfile.writeto('NGC628_2.fits',image,header)
...会出现错误信息:"AttributeError: 'numpy.ndarray' object has no attribute '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上。
@embray
?如果可以,请提供一个最小的代码示例来重现这个问题。否则,它很可能会保持完全神秘,或者是你机器本地的问题。 - Iguananaut