用旧数据从旧数据中写入新的FITS文件

问题描述 投票:1回答:1

我对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数组格式),但是我无法毫不费力地将其另存为新文件或覆盖现有文件。我正在重写一些旧的...

python-3.x numpy astropy pyfits
1个回答
0
投票

[好吧,我认为您犯了一个小错误,因为您一直只是简单地忽略了它,这使您无法自拔,找到了不同的解决方案。您的其他无效尝试也可能会奏效,除了一件细微的小事情。我将首先检查出什么地方出了问题,然后再解释某些后续情况下出了什么问题,所以这有点长...

首先,在原始代码中,您拥有:

© www.soinside.com 2019 - 2024. All rights reserved.