Python scipy: 对于 ** 或 pow() 不支持的操作数类型:'list' 和 'list

9 投票
1 回答
60816 浏览
提问于 2025-04-17 12:24

我需要把一个函数拟合到一组数据上,并找出这个函数的最佳系数。我使用的是来自scipy库的curve_fit方法。这个方法是基于最小二乘法的。

import numpy as np 
from scipy.optimize import curve_fit

#This is my function from which i need to get optimal coefficients 'a' and 'b'
def func(x, a, b):  
return a*x**(b*x)

#the arrays of input data                               
x = [1,2,3,4,5]
y =[6,7,8,9,10]

#default (guess) coefficients
p0 = [1, 1] 

popt, pcov = curve_fit(func, x, y, p0)
print popt

但是它返回了以下错误信息:

TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'list'

不过,当我使用另一个更简单的函数,没有幂运算时,它就能正常工作。

def func(x, a, b):  
return a*x + b

这可能是因为它试图对整个输入数据数组进行幂运算。

我该怎么办?请帮帮我...

1 个回答

15

看起来你想要的是逐个元素进行幂运算吧?

比如说对每个 i 来说,像这样 a*x[i]**(b*x[i])

如果是这样的话,你需要使用 np.power 这个函数:

def func(x,a,b):
    return a*np.power(x,b*x)

这样就可以正常工作了。

顺便提一下,把 xy 从列表转换成 numpy 数组可能会更好,方法是用 np.array(x)

撰写回答