How to conserve header when saving an edited .fits file with Astropy?

▼魔方 西西 提交于 2020-02-06 08:21:46

问题


I'm editing a .fits file I have in python but I want the header to stay the exact same. This is the code:

import numpy as np
from astropy.io import fits
import matplotlib.pyplot as plt

# read in the fits file
im = fits.getdata('myfile.fits')
header = fits.getheader('myfile.fits')

ID = 1234

newim = np.copy(im)

newim[newim == ID] = 0
newim[newim == 0] = -99
newim[newim > -99] = 0
newim[newim == -99] = 1

plt.imshow(newim,cmap='gray', origin='lower')
plt.colorbar()


hdu = fits.PrimaryHDU(newim)
hdu.writeto('mynewfile.fits')

All this is fine and does exactly what I want it to do except that it does not conserve the header after it saves the new file. Is there any way to fix this such that the original header file is not lost?


回答1:


First of all don't do this:

im = fits.getdata('myfile.fits')
header = fits.getheader('myfile.fits')

As explained in the warning here, this kind of usage is discouraged (newer versions of the library have a caching mechanism that makes this less inefficient than it used to be, but it's still a problem). This is because the first one returns just the data array from the file, and the latter returns just the header from a file. At that point there's no longer any association between them; it's just a plain Numpy ndarray and a plain Header and their associations with a specific file are not tracked.

You can return the full HDUList data structure which represents the HDUs in a file, and for each HDU there's an HDU object associating headers with their arrays.

In your example you can just open the file, modify the data array in-place, and then use the .writeto method on it to write it to a new file, or if you open it with mode='update' you can modify the existing file in-place. E.g.

hdul = fits.open('old.fits')
# modify the data in the primary HDU; this is just an in-memory operation and will not change the data on disk
hdul[0].data +=1
hdul.writeto('new.fits')

There's also no clear reason for doing this in your code

newim = np.copy(im)

Unless you have a specific reason to keep an unmodified copy of the original array in memory, you can just directly modify the original array in-place.



来源:https://stackoverflow.com/questions/59091888/how-to-conserve-header-when-saving-an-edited-fits-file-with-astropy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!