0

我在 astropy 包中遇到适合文件操作的问题,我需要一些帮助。

我基本上想拍摄一张适合文件格式的图像,并创建一个我需要开始输入校正因子的新文件和一个新图像,然后可以将其与校正因子和原始图像一起使用以生成校正图像。这些中的每一个都将具有相同的尺寸。

从此开始:

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]

谁能给我我缺少的明显知识来执行此操作...最后两行只是为了概述缺少的内容。我已经包括了??也许表明我需要其他东西,也许是 fit.writeto() 或类似的东西......

4

2 回答 2

2

astropy文档一步一步地引导你完成这个任务:创建一个大小为 (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')
于 2016-02-14T17:34:39.167 回答
1

我认为@VincePs 的答案是正确的,但我会添加更多信息,因为我认为您没有在astropy这里使用 well 的功能。

首先,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')

请注意,即使您更改了数据的形状,也不必更改与形状相关的标题关键字,因为在writetoastropy 期间会更新这些(默认情况下)

于 2016-02-15T02:15:56.537 回答