我对FITS文件执行一个非常简单的操作(数据为numpy数组格式,但是我无法将其另存为新文件或覆盖现有文件。)>
我正在重新编写一些旧代码,这些代码使用numpy pyfits模块处理天文FITS文件-我想对其进行更新以使用astropy.io fits模块。具体来说,我使用的某些数据是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 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.shape确认的那样,“ image”数组已正确重塑。但是我一辈子都无法弄清楚如何将其保存到新的(或旧的)FITS文件中。使用旧语法:
fitsfile.writeto('NGC628_2.fits',image,header)
...给出错误消息,“ AttributeError:'numpy.ndarray'对象没有属性'lower'。如果不是的话,根据令人讨厌的文档,我只是忽略了图像和标题,然后尝试保存到原始文件中:
fitsfile.writeto('NGC628.fits')
然后我得到一个错误,指出该文件已经存在。如果我提供关键字“ overwrite = True”,那么它将抱怨“ WinError 32:该进程无法访问该文件,因为该文件正被另一个进程使用:NGCC628.fits”。该文件绝对不能在任何其他程序中打开。
如果我指定新的文件名NGC628_2.fits,则Python崩溃(将我发送回命令提示符)且没有错误。写入的文件非常小,仅包含标题数据,不包含任何图像数据。
如果让我做一个稍微简单一些的操作,就是说,将所有图像数据设置为一个恒定值,然后关闭文件,就让事情变得更加混乱,]
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。我从一份天才的文档中收集到,只需在更新模式下打开文件并关闭它就足够了,在这种情况下就足够了。但是,在重塑图像时,not
也可以使用相同的技巧-FITS文件未更改。
所以我到底在做什么错?更新原始文件或保存到新文件都可以(最好是后者),但我无法使任何一种操作都能正常工作。
编辑:我具有Python版本3.5.3,numpy版本1.17.3,astropy版本3.2.3,并且我正在运行Windows 10。
我可以对FITS文件执行非常简单的操作(数据是numpy数组格式),但是我无法毫不费力地将其另存为新文件或覆盖现有文件。我正在重写一些旧的...
[好吧,我认为您犯了一个小错误,因为您一直只是简单地忽略了它,这使您无法自拔,找到了不同的解决方案。您的其他无效尝试也可能会奏效,除了一件细微的小事情。我将首先检查出什么地方出了问题,然后再解释某些后续情况下出了什么问题,所以这有点长...
首先,在原始代码中,您拥有: