The TypeError
发生的原因是x
被传递给func2
是一个列表。
这是一个例子:
import numpy as np
import scipy.optimize as optimize
def func2(x,a,b):
return a*np.exp(b*(x**2))
x = np.linspace(0,1,6).reshape(2,-1)
y = func2(x,1,1)
x = x.tolist()
y = y.tolist()
print(x)
# [[0.0, 0.2, 0.4], [0.6000000000000001, 0.8, 1.0]]
print(y)
# [[1.0, 1.0408107741923882, 1.1735108709918103], [1.4333294145603404, 1.8964808793049517, 2.718281828459045]]
popt, pcov = optimize.curve_fit(func2, x, y)
# TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
在这种情况下,func2
映射一个数组x
形状为 (2,3) 的数组y
形状为(2,3)。功能optimize.curve_fit
期望返回值来自func2
是一个数字序列——而不是一个数组。
对我们来说幸运的是,在这种情况下,func2
对每个组件进行逐元素操作x
-- 各元素之间不存在相互作用x
。所以如果我们传递一个数组确实没有什么区别x
形状 (2,3) 或形状 (6,) 的一维数组。
如果我们传递一个形状为 (6,) 的数组,那么func2
将返回形状为 (6,) 的数组。完美的。这样就可以了:
x = np.asarray(x).ravel()
y = np.asarray(y).ravel()
popt, pcov = optimize.curve_fit(func2, x, y)
print(popt)
# [ 1. 1.]