我目前正在将一些 C 代码翻译成 Python。此代码用于帮助识别射电天文学中使用的 CLEAN 算法引起的错误。为了进行这种分析,强度图、Q Stokes 图和 U Stokes 图的傅里叶变换值必须在特定像素值处找到(由 ANT_pix 给出)。这些地图只是 257*257 的数组。
下面的代码用 C 运行需要几秒钟,但用 Python 运行需要几个小时。我很确定它经过了极大的优化,因为我对 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)