我对Python很陌生,但我正在尝试为一些数据生成2D高斯拟合。具体地说,恒星通量与坐标系/网格中的某些位置有关。然而,在我的网格中并不是所有的位置都有相应的通量值。我真的不想把这些值设置为零,以防它影响我的拟合度,但我似乎不能将它们设置为nan
并且仍然使高斯拟合工作。这是我使用的代码(从here稍作修改):
import numpy
import scipy
from numpy import *
from scipy import optimize
def gaussian(height, center_x, center_y, width_x, width_y):
width_x = float(width_x)
width_y = float(width_y)
return lambda x,y: height*exp(-(((center_x-x)/width_x)**2+((center_y-y)/width_y)**2)/2)
def moments(data):
total = nansum(data)
X, Y = indices(data.shape)
center_x = nansum(X*data)/total
center_y = nansum(Y*data)/total
row = data[int(center_x), :]
col = data[:, int(center_y)]
width_x = nansum(sqrt(abs((arange(col.size)-center_y)**2*col))/nansum(col))
width_y = nansum(sqrt(abs((arange(row.size)-center_x)**2*row))/nansum(row))
height = nanmax(data)
return height, center_x, center_y, width_x, width_y
def fitgaussian(data):
params = moments(data)
errorfunction = lambda p: ravel(gaussian(*p)(*indices(data.shape)) - data)
p, success = optimize.leastsq(errorfunction, params)
return p
parameters = fitgaussian(data)
fit = gaussian(*parameters)
我的通量值在一个名为data
的2D数组中。如果我在这个数组中有0
而不是nan
值,那么这段代码就可以工作了,否则我的parameters
总是以[nan nan nan nan nan]
的形式出现。如果有办法解决这个问题,我将非常感谢你的洞察力!解释得越详细越好。提前谢谢!在
显然要做的是从
data
中删除nan。然而,这样做还需要移除2DX
,Y
位置数组中的相应位置:现在您可以使用
^{pr2}$optimize.leastsq
(或更新、更简单的optimize.curve_fit
) 要使数据适合模型函数:例如,如果我们用nan生成一些随机的
data
所以
看起来像
用白点表示有NaN值的地方,然后
收益率
只需移除所有没有对应通量值的值。如果在这一点上y轴上没有任何内容,则删除成对的值将无关紧要。在
如果空值等于
''
,则应该删除所有没有通量值的值如果空值等于
^{pr2}$nan
,则此操作将完成相关问题 更多 >
编程相关推荐