2017-06-12 13 views
0

私は、均一な円の異なる半径で強度の読み取り値を記入したnumpy配列を持っています(コンテキストの場合、これは原始星形成モデルの1D放射伝達プロジェクトです:より良いモデルが存在する、私の上司は、私が他人の仕事の仕方を理解するように、私は1つの生産の経験を持っていませんでした)。半径方向の強度の1次元配列を空間強度の2次元配列に回転

私はその1次元アレイを円で回転させて、強度の2D配列を作成して、imshow(または、少しの作業では、aplpy)で表示することができます。最終的な配列は2次元でなければならず、投影は極座標ではなくデカルトでなければなりません。

ネストしたforループで行うことができますが、ルックアップテーブルで行うことができますが、numpyなどでうまくいく方法がなければならないと感じています。

アイデア?

EDIT:

私は戻って、私が前に持っていたforループやif文の私(率直に恐ろしい)混乱を再作成しなければなりませんでした。私が本当に試してみたら、物事を凝縮することでループの1つとif文の1つを取り除くことができます。しかし、目的はforループで動作させることではなく、配列を回転させる方法が組み込まれているかどうかを確認することです。 impBは前に述べたものとは少し異なる配列です。実際にはパーティクルが検出された半径のリストです。次に、半径ビンにそれらのビンを入れて、各半径で強度(または希望する場合は頻度)を取得します。 Rは、無次元の方法でモデルを実行するときに、自分の半径のスケールファクタです。 iResは解像度の倍率で、ラジアルビンをサンプリングする頻度です。他のすべては明確でなければならない。

radJ = np.ndarray(shape=(2*iRes, 2*iRes)) # Create array of 2xRadius square 

for i in range(iRes): 
    n = len(impB[np.where(impB[:] < ((i+1.) * (R/iRes)))]) # Count number of things within this radius +1 
    m = len(impB[np.where(impB[:] <= ((i) * (R/iRes)))])  # Count number of things in this radius 
    a = (((i + 1) * (R/iRes))**2 - ((i) * (R/iRes))**2) * math.pi # A normalisation factor based on area.....dont ask 
    for x in range(iRes): 
     for y in range(iRes): 
      if (x**2 + y**2) < (i * iRes)**2: 
       if (x**2 + y**2) >= (i * iRes)**2: # Checks for radius, and puts in cartesian space 
        radJ[x+iRes,y+iRes] = (n-m)/a # Put in actual intensity bins 
        radJ[x+iRes,-y+iRes] = (n-m)/a 
        radJ[-x+iRes,y+iRes] = (n-m)/a 
        radJ[-x+iRes,-y+iRes] = (n-m)/a 
+0

あなたがそれを実装している場合は、コードが虚偽を共有していますか? – Divakar

+0

私のコードを実際の例で更新しました。 – Franz

答えて

0

ネストされたループは簡単な方法です。 ri_data_ryがあなたの半径の値(中央のピクセルとの違い)と回転のための配列を含むと、それぞれ、私はお勧めします:

from scipy import interpolate 
import numpy as np 
y = np.random.rand(100) 
ri_data_r = np.linspace(-len(y)/2,len(y)/2,len(y)) 
interpol_index = interpolate.interp1d(ri_data_r, y) 
xv = np.arange(-1, 1, 0.01) # adjust your matrix values here 
X, Y = np.meshgrid(xv, xv) 
profilegrid = np.ones(X.shape, float) 
for i, x in enumerate(X[0, :]): 
    for k, y in enumerate(Y[:, 0]): 
     current_radius = np.sqrt(x ** 2 + y ** 2) 
     profilegrid[i, k] = interpol_index(current_radius) 
print(profilegrid) 

これは、あなたが探している正確に何を与えるだろう。配列を取り込み、データ配列と同じ長さを持ち、実際のデータと配列の中央との間の距離を含む対称配列ri_data_rを計算するだけです。コードはこれを自動的に実行しています。

関連する問題