![](https://secure.gravatar.com/avatar/8fcc78062e4d78f014ed64d55c8c434e.jpg?s=120&d=mm&r=g)
To avoid array creation overhead, I use objects encapsulating everything, so def fit_function(self, x, ... ): # x is a subset of all the parameters, self.tofit is bool array with those arg to fit self.p[self.tofit ][:] = x[:] self.p[~self.tofit][:] = self.all_arg [~self.tofit][:] # calls the original residuals routine return residuals(self.p, ... ) Then in your loop, you can change the self.tofit array to change what you fit. Obviously, self.all_arg default to something in the __init__() method and self.p is created once there, and things can be changed. If things are slow, the line self.p[~self.tofit][:] = self.all_arg [~self.tofit][:] can be removed and put into it's own method, only to be called if self.tofit changes. Benny 2008/10/19 Maximilian Fabricius <mxhf@gmx.net>
On Sun, Oct 19, 2008 at 12:52 PM, Robin <robince@gmail.com> wrote:
On Sun, Oct 19, 2008 at 11:28 AM, Maximilian Fabricius <mxhf@gmx.net> wrote:
Robin,
thank you for the quick reply. Indeed, but this would still involve to swap parameters around between fixed and non-fixed and changing the lambda function manually rather then just switching the fissint on and off with a single variable.
But no doubt, a wrapper can be done.
I couldn't think of a way to squeeze it into a lamdba single statement, but something like this would do:
def fit_function(x, fit, y): p0 = zeros(fit.size) p0[fit] = x p0[~fit] = y
where fit is a boolean array, x is the ones to optimised and y are the fixed values. You have the extra overhead of the p0 array allocation for every iteration of the function - but perhaps that is worth it for the convenience.
Robin _______________________________________________ Scipy-dev mailing list Scipy-dev@scipy.org http://projects.scipy.org/mailman/listinfo/scipy-dev
Robin,
great, nice idea! As this may be of use to others, my solution now is:
def fit_function(p_fit, fit, p_fixed, ... ): # assemble p_fit and p_fixed into a single array # while restoring the correct order of the original p0 array. p = zeros(fit.size) p[ where(fit == True) ] = p_fit p[ where(fit == False) ] = p_fixed # calls the original residuals routine return residuals(p, ... )
main(): # best guesses p0 = zeros(10) p0[0] = vrot_d p0[1] = vsig_d ....
# choose which parameters to fit fit = zeros(len(p0)) fit[0:7] = True fit[8] = False fit[9] = False
# store parameters which should be fit in p_fit # all the others in p_fixed p_fit = p0[ where(fit == True) ] p_fixed = p0[ where(fit == False) ] plsq = leastsq(fit_function, p_fit, args=(fit, p_fixed, ...) )
Thanks!
Cheers,
Maximilian _______________________________________________ Scipy-dev mailing list Scipy-dev@scipy.org http://projects.scipy.org/mailman/listinfo/scipy-dev