2016-04-02 27 views
0

私の問題の解決策を見つけることができましたが、できませんでした。私はFITSのデータキューブを持っているので、PyFITSでそれを切り抜く必要があります。私のスクリプトでそれを行うと、最終的に2次元のフィット画像が表示されます。第1の次元はエネルギーであり、第2および第3は経度および緯度である。クロップFITSデータキューブ画像からPyFITS

私のスクリプトは以下の通りです:

#!/usr/bin/env python 
import pyfits 
import os 
import sys 


def CropFitsFile(src, dst, xs, xe, ys, ye): 
    fh = pyfits.open(src) 
    for eng in range(0,2): 
     img = fh[0].data[eng,ys:ye,xs:xe] 
     header = fh[0].header 
     newfh=pyfits.PrimaryHDU(data=img,header=header) 
     if os.path.exists(dst): 
      os.remove(dst) 
     newfh.writeto(dst) 


if __name__ == "__main__": 
    CropFitsFile(
     src=sys.argv[1], 
     dst=sys.argv[2], 
     xs=int(sys.argv[3]), 
     xe=int(sys.argv[4]), 
     ys=int(sys.argv[5]), 
     ye=int(sys.argv[6]) 
     ) 
+0

問題であり、正確には何?これは多かれ少なかれよく見えます。いくつかの小さなメモでは、 'pyfits'は非難され、代わりに' astropy.io.fits'を使うべきです(インポート以外のコードの変更は必要ありません)。また、 'wrtieto'メソッドには既に既存のファイルを上書きする機能が組み込まれています(' clobber'オプション)。そのために特別なコードは必要ありません。しかし、もう一度、質問がありましたか? – Iguananaut

+0

こんにちはIguananaut、ご返信ありがとうございます。問題は、3Dデータキューブをトリミングする必要があることですが、コードを実行すると結果は2次元のフィットイメージになります。私はそれをどのように修正できるのか分かりません。私はpyropesをastropy.io.fitsで置き換えましたが、それと同じ問題です。あなたの助けをもう一度ありがとう –

+0

それでも、それは3次元を持っていますが、サイズ1の最初の次元ですか? – Iguananaut

答えて

0

私が正しく理解していれば、あなたが3D配列をスライスが、第三の次元を(それだけでサイズ1だとしても)保存しておきたいです。

これはNumpyアレイに関する質問です。 N次元の配列がある場合、1次元のスカラーインデックスを渡すと、次元N-1の配列が返され、インデックスを付けた軸に沿ってスライスされます。必要に応じてN次元配列の代わりに、N-1次元配列を返すために、何らかの理由で、

>>> arr[:,0,:] 
array([[ 0, 1, 2], 
     [ 9, 10, 11], 
     [18, 19, 20]]) 

:たとえば:

>>> arr = np.arange(27).reshape(3, 3, 3) 
>>> arr 
array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8]], 

     [[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]], 

     [[18, 19, 20], 
     [21, 22, 23], 
     [24, 25, 26]]]) 
>>> arr[0] 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
>>> arr[1] 
array([[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]) 

また、のような別の軸に沿ってスライスすることができます最も簡単な方法は、スカラーインデックスを使用する代わりに、明示的にサイズ1のスライスを要求することです。たとえば:これは本当にあなたのデータは、FITSファイルから出てきたという事実を超えたPyFITSについての質問ではありません。

>>> arr[0:1] 
array([[[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]]) 

私はこのような他の質問に与えた同じアドバイスを与えるでしょう。 PyFITSは、ほとんどの科学的なPythonライブラリと同様に、データをnumpy配列として返します。これらは、ほとんどの科学的なPythonアプリケーションで数値データに使用される主なデータ構造です。numpyの基本を学ぶことは、Pythonでデータ分析を行うことが前提条件の1つです。 MATLABを使用したことがある場合、NumPy配列はMATLABの配列に似ています。あなたは私の短いチュートリアルを開始することができますが、他の(おそらくより良いものがあまりにもあります:) github.com/embray/notebooks/blob/master/numpy.ipynb

+0

ご協力いただきありがとうございます。そのリンクは私に多くの答えを見つけるのを助けました:)はい私はFITSファイルのmanupulatingヘッダーについてもっと知る必要がありました。 np.resizeのような2-Dまたは3-D FITSファイルのサイズを変更する方法はたくさんあるようです。 ) –

+0

ヘッダーに関しては、画像の寸法に関するヘッダーキーワードを手動で編集する必要はないというアドバイスを参考にしてください。この回答が問題を解決した場合は、解決策を受け入れてください。 – Iguananaut

-1
from astropy.io import fits 

Ccube = fits.open('Cha_binned_ccube.fits', mode='update') 
Ccube.info() 
Ccube[0].shape 
Ccube[0].data = Ccube[0].data[0:3,0:181,0:402] 
Ccube[0].writeto('Cha_binned_ccube_resize.fits') 
+1

このコードで質問に答えるかもしれませんが、_why_および/または_how_に関する追加のコンテキストを に追加すると、 と回答すると、その質問は長期的には という値に大幅に改善されます。あなたの答えを[編集]して、説明を加えてください。 –

関連する問題