2016-05-19 8 views
0

私のデータは、適合フォーマット(example.fits)のテーブルで整理されています。 Pythonモジュールatpyを使ってこのテーブル(mappars)を開きます。テーブルは、画像座標である列x、yとデータ列zとを有する。 x、yは等間隔に配置されていますが(CCD検出器のイベント)、その間にはギャップがあります。astropyを使ってPythonの中点を効率的に取得する

は、私はこのような画像の真ん中の値を取得しています:

import atpy 
import numpy as np 

mappars = atpy.Table('example.fits') 
#get midpoint value 
midx = np.int((np.max(mappars['x'])+np.min(mappars['x']))/2) 
midy = np.int((np.max(mappars['y'])+np.min(mappars['y']))/2) 
midist = mappars.where((mappars.x == midx) & (mappars.y == midy)['z'] 

atpyの一部である.where機能なし)これを行うためのより効率的な方法はありますか? astropy .tableに対応する関数もあります。atpyからastropyに移動したいのですが?

答えて

1

astropy.ionumpyを使用すると、これを非常に似ているはずです。私は、イベントが便利なファイルを持っていないが、のようなもの:astropy.ioインポートから

はこの場合、NP

with fits.open("example.fits") as hdulist: 
    events = hdulist[1].data # since hdu 0 should be an ImageHDU type, the events are probably in the first extension 
    midx = np.int((np.max(events['x'])+np.min(events['x']))/2) 
    midy = np.int((np.max(events['y'])+np.min(events['y']))/2) 
    midist = events['z'][(events['x'] == midx) & (events['y'] == midy)] 

として 輸入numpyのに合う、私は直接にブールインデックス配列を作成していますブール値(numpy)式events['x'] == midx) & (events['y'] == midy)を使用してevents['z']を返します。

これはテストされていないことに注意してください。上記の方法が失敗した場合は、イベントファイルが特有のものでない限り、おそらくインターネットからどこかの場所にあるイベントファイルを試してみることができます。

ところで

xyはあなたが純粋な整数除算を使用して物事を少し簡単にすると、intにキャストをスキップすることができ、たとえば、整数ピクセルの座標である場合:

midx = (np.max(events['x'])+np.min(events['x']))//2 
midy = (np.max(events['y'])+np.min(events['y']))//2 

これはPython 3で直接動作し、Python 2ではfrom __future__ import division(おそらくこれを実行する必要があります)がある場合は動作します。

+0

ありがとうございました!私は自分のテーブルの特定のフォーマットで動作させるために、わずか2回小さなコードを編集しました。また、 'from __future__ import division'もうまくいきました(Python 2.7を使用)。 – Florian

+1

ニース。また、あなたの編集は正しかったですが、査読者が私が作った(明らかな)間違いやあなたの修正を認識できなかったので、拒否されました。私は今それを自分で修正しました。 – Evert

関連する問題