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]

これを行うために欠けている明らかな知識を誰か教えてもらえますか...最後の2行は、何が欠けているかを概説するためのものです。含めました?? おそらく何か他のものが必要であることを知らせるために、おそらくfits.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ここでの機能をうまく使用していないと思うので、さらに情報を追加します。

まず第一に、Python は 0 から始まるため、主要な拡張機能の番号は0. 間違っているかもしれませんが、そうでないかもしれませんが、2番目にアクセスすることはめったにないHDUので、言及した方がよいと思いました。

hdu_num = 0 # Or use = 1 if you really want the second hdu.

まず、同じファイルを 2 回開く必要はありません。一度開いて、関連する値を抽出した後に閉じることができます。

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.

2 番目のアプローチを続けます。これは、はるかにクリーンで、すべてのデータとヘッダー値を準備できると思うからです。

new_data = np.zeros((hdr['NAXIS2'], hdr['NAXIS1']))

Python は IRAF とは異なる軸を解釈することに注意してください (IDL だと思いますが、よくわかりません) ので、最初の要素として axis2 と 2 番目の要素として 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 に答える