我想在fits数组中生成一些高斯源。代码在下面。
from astropy.io import fits
from numpy import *
xx=yy=1024
xc=xx/2.;yc=yy/2.
A=10.0
gau=zeros([xx,yy])
for i in range(xx):
for j in range(yy):
gau[i,j]= A*exp(-((i-xc)/50.)**2 - ((j-yc)/50.)**2)
fits.writeto('gaussian_model.fits',gau,overwrite=True)
我对n
数字进行了迭代,并在fits文件中添加了所有高斯型。这是非常缓慢的(xx,yy)
的n
号码。有没有其他有效的方法可以加快n
源代码在(xx,yy)
上的迭代速度?
2条答案
按热度按时间kuuvgm7e1#
为了在numpy中有效地实现2d高斯,你应该注意到2d高斯是可分离的,可以通过将两个1d高斯相乘来实现,将传递给
np.exp
的参数的大小(这是昂贵的)从M * N
减少到M + N
:时间:
结果如下:
chy5wohz2#
你可以使用向量化(vectorization)来加速你的代码。对整个数组使用numpy而不是循环,本质上是将循环推到编译的C代码中,这更快)。这可以使用
np.meshgrid
来制作xx
和yy
的组合数组(本质上是创建xx
和yy
组合的数组),或者通过添加新轴来使用broadcasting。对于这两种方法,您都必须创建xx
和yy
值的向量,我使用np.arange
(numpy用于创建具有给定间距的列表的方法,默认值为1)。你应该读一下numpy basics here。如果你用numpy数组写循环,那么你可能做错了什么。
此外,使用
*
导入也是不好的做法。