@@ -332,17 +332,19 @@ def _initialize_curvefit_params(params, p0, bounds, func_args):
332
332
"""Set initial guess and bounds for curvefit.
333
333
Priority: 1) passed args 2) func signature 3) scipy defaults
334
334
"""
335
+ from xarray .core .computation import where
335
336
336
337
def _initialize_feasible (lb , ub ):
337
338
# Mimics functionality of scipy.optimize.minpack._initialize_feasible
338
339
lb_finite = np .isfinite (lb )
339
340
ub_finite = np .isfinite (ub )
340
341
p0 = np .nansum (
341
342
[
342
- 0.5 * (lb + ub ) * int (lb_finite & ub_finite ),
343
- (lb + 1 ) * int (lb_finite & ~ ub_finite ),
344
- (ub - 1 ) * int (~ lb_finite & ub_finite ),
345
- ]
343
+ 0.5 * (lb + ub ) * (lb_finite & ub_finite ),
344
+ (lb + 1 ) * (lb_finite & ~ ub_finite ),
345
+ (ub - 1 ) * (~ lb_finite & ub_finite ),
346
+ ],
347
+ axis = 0 ,
346
348
)
347
349
return p0
348
350
@@ -352,9 +354,13 @@ def _initialize_feasible(lb, ub):
352
354
if p in func_args and func_args [p ].default is not func_args [p ].empty :
353
355
param_defaults [p ] = func_args [p ].default
354
356
if p in bounds :
355
- bounds_defaults [p ] = tuple (bounds [p ])
356
- if param_defaults [p ] < bounds [p ][0 ] or param_defaults [p ] > bounds [p ][1 ]:
357
- param_defaults [p ] = _initialize_feasible (bounds [p ][0 ], bounds [p ][1 ])
357
+ lb , ub = bounds [p ]
358
+ bounds_defaults [p ] = (lb , ub )
359
+ param_defaults [p ] = where (
360
+ (param_defaults [p ] < lb ) | (param_defaults [p ] > ub ),
361
+ _initialize_feasible (lb , ub ),
362
+ param_defaults [p ],
363
+ )
358
364
if p in p0 :
359
365
param_defaults [p ] = p0 [p ]
360
366
return param_defaults , bounds_defaults
0 commit comments