我有一个问题,在天文软件包中适合文件操作,我需要一些帮助。
我基本上想拍摄一张合适的文件格式的图像,并创建一个新的文件,我需要开始输入校正因子和一个新的图像,然后可以与校正因子和原始图像一起使用来生成校正图像。每个都具有相同的尺寸。
从这开始:
from astropy.io import fits
# Compute the size of the images (you can also do this manually rather than calling these keywords from the header):
#URL: /Users/UCL_Astronomy/Documents/UCL/PHASG199/M33_UVOT_sum/UVOTIMSUM/M33_sum_epoch1_um2_norm.img
nxpix_um2_ext1 = fits.open('...')[1]['NAXIS1']
nypix_um2_ext1 = fits.open('...')[1]['NAXIS2']
#nxpix_um2_ext1 = 4071 #hima_sk_um2[1].header['NAXIS1'] # IDL: nxpix_uw1_ext1 = sxpar(hima_sk_uw1_ext1,'NAXIS1')
#nypix_um2_ext1 = 4321 #hima_sk_um2[1].header['NAXIS2'] # IDL: nypix_uw1_ext1 = sxpar(hima_sk_uw1_ext1,'NAXIS2')
# Make a new image file with the same dimensions (and headers, etc) to save the correction factors:
coicorr_um2_ext1 = ??[nxpix_um2_ext1,nypix_um2_ext1]
# Make a new image file with the same dimensions (and headers, etc) to save the corrected image:
ima_sk_coicorr_um2_ext1 = ??[nxpix_um2_ext1,nypix_um2_ext1]
任何人都可以向我提供我所缺少的明显知识吗...最后两行只是为了概述缺少的内容。我已经包括??或许发出信号,我需要其他东西,或许适合.writeto()或类似的......
答案 0 :(得分:2)
astropy documentation将逐步引导您执行此任务:创建一个大小为(NAXIS1,NAXIS2)的数组,将数据放入主HDU,制作HDUlist并将其写入磁盘:
import numpy as np
from astropy.io import fits
data = np.zeros((NAXIS2,NAXIS1))
hdu = fits.PrimaryHDU(data)
hdulist = fits.HDUList([hdu])
hdulist.writeto('new.fits')
答案 1 :(得分:1)
我认为@VincePs的答案是正确的,但我会添加更多信息,因为我认为你在这里没有使用astropy
的功能。
首先,Python基于零,因此主扩展名为0
。也许你弄错了,也许你不会 - 但访问第二个HDU
并不常见,所以我想我最好提一下。
hdu_num = 0 # Or use = 1 if you really want the second hdu.
首先,您不需要两次打开同一个文件,您可以打开一次并在提取相关值后将其关闭:
with fits.open('...') as hdus:
nxpix_um2_ext1 = hdus[hdu_num]['NAXIS1']
nxpix_um2_ext1 = hdus[hdu_num]['NAXIS2']
# Continue without indentation and the file will be closed again.
或者如果你想保留整个标题(以便稍后保存)和你可以使用的数据:
with fits.open('...') as hdus:
hdr = hdus[hdu_num].header
data = hdus[hdu_num].data # I'll also take the data for comparison.
我将继续使用第二种方法,因为我觉得它更清洁,并且您已准备好所有数据和标题值。
new_data = np.zeros((hdr['NAXIS2'], hdr['NAXIS1']))
请注意,Python解释轴与IRAF不同(我认为IDL,但我不确定)所以你需要将axis2作为第一个,将axis1作为第二个元素。
所以快速检查一下形状是否相同:
print(new_data.shape)
print(data.shape)
如果它们不相等,我会在Python中对这个轴感到困惑(再次),但我不这么认为。但是,除了基于header
值创建新数组,您还可以通过使用旧形状创建新数组:
new_data_2 = np.zeros(data.shape)
这将确保尺寸和形状相同。现在你有一个空图像。如果您更喜欢副本,那么您可以(但不需要)明确地复制数据(除非您在写入/追加/更新模式下显式打开文件,否则您应该始终复制它,但这不是默认值。)
new_data = data # or = data.copy() for explicitly copying.
对它进行操作,如果你想再次保存,可以使用@VinceP建议的内容:
hdu = fits.PrimaryHDU(new_data, header=hdr) # This ensures the same header is written to the new file
hdulist = fits.HDUList([hdu])
hdulist.writeto('new.fits')
请注意,即使您更改了数据的形状,也不必更改与形状相关的标题关键字,因为在writeto
期间,astropy会更新这些(默认情况下)