現在、いくつかの C コードを Python に変換する作業を行っています。このコードは、電波天文学で使用される CLEAN アルゴリズムから生じるエラーを特定するために使用されています。この分析を行うには、強度マップ、Q ストークス マップ、U ストークス マップのフーリエ変換の値を特定のピクセル値 (ANT_pix で指定) で見つける必要があります。これらのマップは 257*257 配列です。
以下のコードは、C で実行するには数秒かかりますが、Python で実行するには数時間かかります。私のPythonの知識はかなり貧弱なので、それがひどく最適化されていると確信しています。
ご協力いただきありがとうございます。
更新私の質問は、Python でループを実装するより良い方法があるかどうかです。これにより、速度が向上します。可能であればPythonでネストされたforループを回避することを推奨するPythonに関する他の質問について、ここでかなりの数の回答を読みました。最適化されたループ。私はこれが難しい注文かもしれないことを理解しています!
今までは FFT を使ってきましたが、上司は DFT がどのような違いを生むかを知りたがっています。これは、通常、アンテナの位置が正確なピクセル値で発生しないためです。FFT を使用するには、最も近いピクセル値に丸める必要があります。
私は Python を CASA として使用しています。電波天文学のデータセットを削減するために使用されるコンピューター プログラムは Python で記述されており、Python スクリプトを実装するのは C よりもはるかに簡単です。
オリジナルコード
def DFT_Vis(ANT_Pix="",IMap="",QMap="",UMap="", NMap="", Nvis=""):
UV=numpy.zeros([Nvis,6])
Offset=(NMap+1)/2
ANT=ANT_Pix+Offset;
i=0
l=0
k=0
SumI=0
SumRL=0
SumLR=0
z=0
RL=QMap+1j*UMap
LR=QMap-1j*UMap
Factor=[math.e**(-2j*math.pi*z/NMap) for z in range(NMap)]
for i in range(Nvis):
X=ANT[i,0]
Y=ANT[i,1]
for l in range(NMap):
for k in range(NMap):
Temp=Factor[int((X*l)%NMap)]*Factor[int((Y*k)%NMap)];
SumI+=IMap[l,k]*Temp
SumRL+=RL[l,k]*Temp
SumLR+=IMap[l,k]*Temp
k=1
UV[i,0]=SumI.real
UV[i,1]=SumI.imag
UV[i,2]=SumRL.real
UV[i,3]=SumRL.imag
UV[i,4]=SumLR.real
UV[i,5]=SumLR.imag
l=1
k=1
SumI=0
SumRL=0
SumLR=0
return(UV)