scipy.optimize.curve_fit 的不支持操作数类型错误

3 投票
1 回答
2152 浏览
提问于 2025-04-18 04:57

我正在尝试使用 scipy.optimize.curve_fit 来拟合一个模型函数,但下面的代码给我带来了一个错误:

from scipy.optimize import curve_fit
from math import log10

def my_func(x, alpha):
return [10*log10(alpha*y*y) for y in x]

known_x = [1039.885254, 2256.833008, 6428.667969, 30602.62891] #known x-values
known_y = [31.87999916, 33.63000107, 35, 36.74000168]

popt, pcov = curve_fit(my_func, known_x, known_y)

我遇到的错误是:

TypeError: unsupported operand type(s) for -: 'list' and 'list'

我知道有相关的问题在 这里这里 被提问过,但我从那些回答中没有找到解决我问题的方法。

我仔细检查了 curve_fit 传给我函数的参数类型,发现 alphanumpy.float64 类型,而 xlist 类型。

谢谢你的帮助。

这是错误的追踪信息:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    popt, pcov = curve_fit(my_func, known_x, known_y)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 506, in curve_fit
    res = leastsq(func, p0, args=args, full_output=1, **kw)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 348, in leastsq
    m = _check_func('leastsq', 'func', func, x0, args, n)[0]
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 14, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 418, in _general_function
    return function(xdata, *params) - ydata
TypeError: unsupported operand type(s) for -: 'list' and 'list'

这是 _general_function

def _general_function(params, xdata, ydata, function):
    return function(xdata, *params) - ydata

1 个回答

5

你需要把你的 list 转换成 np.array

def my_func(x, alpha):
    return np.array([10*np.log10(alpha*y*y) for y in x])

known_x = np.array([1039.885254, 2256.833008, 6428.667969, 30602.62891]) #known x-values
known_y = np.array([31.87999916, 33.63000107, 35, 36.74000168])

结果:

(array([ 0.00012562]), array([[  2.38452809e-08]]))

原因很明显,正如这个信息所指出的:

TypeError: unsupported operand type(s) for -: 'list' and 'list'

没错,list 不能直接用另一个 list 来做减法。为了能够进行这样的操作,我们需要把它们转换成 numpy.array

撰写回答