[SciPy-user] object too deep??
Christian K
ckkart at hoc.net
Fri Jun 29 10:36:44 EDT 2007
Emanuele Zattin wrote:
> hmm... i see... that must be it.
> the fact is that the number of gaussians to fit is not constant so how
> can i build a function that will fit them if params only accepts
> scalars?
Well, per set of parameters height, center_x, center_y, width you have to create
one gaussian-lambda and sum them up in the end.
> On 6/29/07, Christian K <ckkart at hoc.net> wrote:
>> Emanuele Zattin wrote:
>>> I have this optimization problem:
>>>
>>> this function returns the sum of some gaussians given their parameters
>>> in arrays:
>>>
>>> def gaussian(height, center_x, center_y, width):
>>> """Returns a gaussian function with the given parameters"""
>>> width = float(width)
>>> return lambda x,y:
>>> sum(height*exp(-(((center_x-x)/width)**2+((center_y-y)/width)**2)/2))
gaussian() returns only a single peak 'object'. So no reason to sum here.
>>>
>>> this function tries to fit given a starting image:
>>>
>>> def fitgaussian(data, obj_x, obj_y, obj_v):
>>> """Returns (height, x, y, width)
>>> the gaussian parameters of a 2D distribution found by a fit"""
>>> #params = moments(data)
>>> params = obj_v, obj_x-obj_x[0]+2, obj_y-obj_y[0]+2, ones(len(obj_x))
>> params is a tuple of some objects which you don't tell us what they are and at
>> least one ndarray (ones(....)). This is probably the error. params has to be a
>> list or array contatining only scalars.
>>
>>> errorfunction = lambda p: ravel(gaussian(*p)(*indices(data.shape)) - data)
Here you could do the summing of the gaussian peaks. By hand it would be like this:
gaussian(p[:4])(*indices(data.shape)+gaussian(p[4:8])(*indices(data.shape)+....
It should be possible to find an automatic way though.
Christian
More information about the SciPy-User
mailing list