2

現在、いくつかの 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)
4

3 に答える 3

3

独自に記述するのではなく、おそらく numpy のフーリエ変換コードを使用する必要があります: http://docs.scipy.org/doc/numpy/reference/routines.fft.html

于 2012-04-08T15:03:55.713 に答える
1

私は FFT の専門家ではありませんが、FFT は単に DFT を計算する高速な方法であると理解しています。あなたの質問は、バブル ソート アルゴリズムを作成して、クイック ソートよりも優れた答えが得られるかどうかを確認しようとしているように思えます。どちらも同じ結果が得られる並べ替えアルゴリズムです。

だから私はあなたの基本的な前提に疑問を呈しています。データの丸めを変更して、SciPy FFT コードから同じ結果を得ることができるかどうか疑問に思っています。

また、私の DSP 教科書によると、FFT は DFT を計算するよりも正確な答えを生成できます。これは、単純に浮動小数点演算が不正確であり、FFT が正しい答えを見つけるまでに呼び出す浮動小数点演算が少ないためです。

必要な計算を実行する実用的な C コードがある場合は、いつでも C コードをラップして、Python から呼び出すことができます。ここでの議論: C ライブラリを Python でラップする: C、Cython、または ctypes?

実際の質問に答えるには: @ ZoZo123 が指摘したように、 から に変更することは大きなメリットrange()ですxrange()。ではrange()、Python は数字のリストを作成し、完了したらリストを破棄する必要があります。xrange()Python では、一度に 1 つずつ数値を生成する反復子を作成するだけです。(ただし、Python 3.x ではrange()、イテレータが作成され、 がないことに注意してくださいxrange()。)

また、このコードを残りのコードと統合する必要がない場合は、このコードを PyPy で実行してみてください。これは、まさに PyPy が最適化できる種類のコードです。PyPy の問題は、現在プロジェクトが「純粋な」Python でなければならず、NumPy を使用しているように見えることです。(NumPy と PyPy を連携させるプロジェクトがありますが、まだ完了していません。) http://pypy.org/

このコードを残りのコードと統合する必要がある場合は、Cython を検討する必要があると思います (@Krzysztof Rosiński が指摘)。

于 2012-04-08T19:32:47.800 に答える