从 astropy.modeling Gaussian2D 中提取参数
Extracting parameters from astropy.modeling Gaussian2D
我已经设法使用 astropy.modeling
在我的图像上建立二维高斯模型,它为适应图像而生成的参数似乎是合理的。但是,我需要 运行 对数千张图像进行 2D 高斯分布,因为我们有兴趣检查模型的 x 和 y 平均值,以及图像上的 x 和 y 标准差。模型输出如下所示:
m2
<Gaussian2D(amplitude=0.0009846091239480168, x_mean=30.826676737477573, y_mean=31.004045976953222, x_stddev=2.5046722491074536, y_stddev=3.163048479350727, theta=-0.0070295894129793896)>
我也可以告诉你:
type(m2)
<class 'astropy.modeling.functional_models.Gaussian2D'>
Name: Gaussian2D
Inputs: (u'x', u'y')
Outputs: (u'z',)
Fittable parameters: ('amplitude', 'x_mean', 'y_mean', 'x_stddev', 'y_stddev', 'theta')
我需要的是一种提取模型参数的方法,即:
x_mean
y_mean
x_stddev
y_stddev
我不熟悉这个表单输出,所以我真的很困惑如何提取参数。
模型具有您可以访问的属性:
from astropy.modeling import models
g2d = models.Gaussian2D(1,2,3,4,5)
g2d.amplitude.value # 1.0
g2d.x_mean.value # 2.0
g2d.y_mean.value # 3.0
g2d.x_stddev.value # 4.0
g2d.y_stddev.value # 5.0
您需要在拟合模型后提取这些值,但您可以通过相同的方式访问它们:.<name>.value
。
您也可以一次提取它们,但是您需要跟踪哪个参数在哪个位置:
g2d.parameters # array([ 1., 2., 3., 4., 5., 0.])
# Amplitude
g2d.parameters[0] # 1.0
# x-mean
g2d.parameters[1] # 2.0
# ...
另一种方法是使用 estimate_line_parameters。它的文档在这方面不是很清楚(或者我认为)。如果问题是获取直线高斯分布的起始参数,这是一个很好的起点。
这样处理:
from specutils.spectra import Spectrum2D
from specutils.fitting import estimate_line_parameters
...
e1 = estimate_line_parameters(spectrum, models.Gaussian2D())
a = e1.amplitude.value
b = e1.x_mean.value
c = e1.y_mean.value
d = x_stddev.value
e = y_stddev.value
estimate_line_parameters 给出小数位的结果负载,因此如果您尝试 估计 起始值,您可能希望使用 round(value_name , n) 其中 n 是您认为合适的 dec 位数。
注意 a、b、c 等作为值返回并且不保留单位。所以你还需要:
from astropy import units as u
然后(例如)a = e1.amplitude.value*u.(flux_units) 其中 flux_units 是 Jy 或类似的 and/or 缩放版本。
当然,所有这些都假设您已经充分减去背景...
我已经设法使用 astropy.modeling
在我的图像上建立二维高斯模型,它为适应图像而生成的参数似乎是合理的。但是,我需要 运行 对数千张图像进行 2D 高斯分布,因为我们有兴趣检查模型的 x 和 y 平均值,以及图像上的 x 和 y 标准差。模型输出如下所示:
m2
<Gaussian2D(amplitude=0.0009846091239480168, x_mean=30.826676737477573, y_mean=31.004045976953222, x_stddev=2.5046722491074536, y_stddev=3.163048479350727, theta=-0.0070295894129793896)>
我也可以告诉你:
type(m2)
<class 'astropy.modeling.functional_models.Gaussian2D'>
Name: Gaussian2D
Inputs: (u'x', u'y')
Outputs: (u'z',)
Fittable parameters: ('amplitude', 'x_mean', 'y_mean', 'x_stddev', 'y_stddev', 'theta')
我需要的是一种提取模型参数的方法,即:
x_mean
y_mean
x_stddev
y_stddev
我不熟悉这个表单输出,所以我真的很困惑如何提取参数。
模型具有您可以访问的属性:
from astropy.modeling import models
g2d = models.Gaussian2D(1,2,3,4,5)
g2d.amplitude.value # 1.0
g2d.x_mean.value # 2.0
g2d.y_mean.value # 3.0
g2d.x_stddev.value # 4.0
g2d.y_stddev.value # 5.0
您需要在拟合模型后提取这些值,但您可以通过相同的方式访问它们:.<name>.value
。
您也可以一次提取它们,但是您需要跟踪哪个参数在哪个位置:
g2d.parameters # array([ 1., 2., 3., 4., 5., 0.])
# Amplitude
g2d.parameters[0] # 1.0
# x-mean
g2d.parameters[1] # 2.0
# ...
另一种方法是使用 estimate_line_parameters。它的文档在这方面不是很清楚(或者我认为)。如果问题是获取直线高斯分布的起始参数,这是一个很好的起点。
这样处理:
from specutils.spectra import Spectrum2D
from specutils.fitting import estimate_line_parameters
...
e1 = estimate_line_parameters(spectrum, models.Gaussian2D())
a = e1.amplitude.value
b = e1.x_mean.value
c = e1.y_mean.value
d = x_stddev.value
e = y_stddev.value
estimate_line_parameters 给出小数位的结果负载,因此如果您尝试 估计 起始值,您可能希望使用 round(value_name , n) 其中 n 是您认为合适的 dec 位数。
注意 a、b、c 等作为值返回并且不保留单位。所以你还需要:
from astropy import units as u
然后(例如)a = e1.amplitude.value*u.(flux_units) 其中 flux_units 是 Jy 或类似的 and/or 缩放版本。
当然,所有这些都假设您已经充分减去背景...