如何在数组中生成多个二维高斯源?

问题描述 投票:0回答:1

我想在拟合数组中生成多个高斯源。我的代码如下。

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
数字进行了迭代,并将所有高斯函数添加到拟合文件中。对于
(xx,yy)
数字来说,迭代
n
的速度非常慢。有没有其他有效的方法我应该尝试加快
(xx,yy)
n
源的迭代速度?

python numpy astropy
1个回答
0
投票

您可以使用矢量化来加速代码(即对整个数组使用 numpy 而不是循环,本质上是将循环推送到已编译的 C 代码,这样速度更快)。这可以使用

np.meshgrid
来制作
xx
yy
的组合数组(本质上创建
xx
yy
组合的数组)或通过添加新轴来使用 broadcasting 来完成。对于这两种方法,您都必须创建
xx
yy
值的向量,我是通过使用
np.arange
来完成的(numpy 用于创建具有给定间距的列表的方法,默认值为 1)。

import numpy as np

xx = 1024
yy = 1024

xc = xx/2.
yc = yy/2.

A = 10.0

XX, YY = np.meshgrid(np.arange(xx), np.arange(yy))
# or
# XX = np.arange(xx)[:, None]
# YY = np.arange(yy)[None, :]
gau = A*np.exp(-((XX-xc)/50.)**2 - ((YY-yc)/50.)**2)

您应该在此处阅读numpy 基础知识。如果您使用 numpy 数组编写循环,那么您可能做错了什么。

此外,使用

*
导入也是不好的做法。

© www.soinside.com 2019 - 2024. All rights reserved.