【问题标题】:multivariable non-linear curve_fit with scipy多变量非线性curve_fit与scipy
【发布时间】:2017-01-31 07:47:34
【问题描述】:

我一直在尝试使用 scipy.optimize curve_fit 使用多个变量。它适用于我创建的测试代码,但是当我尝试在我的实际数据上实现它时,我不断收到以下错误

TypeError: 只有长度为 -1 的数组可以转换为 python 标量

我的测试代码和实际代码中的数组形状及其元素的数据类型完全相同,所以我很困惑为什么会出现这个错误。

测试代码:

    import numpy as np 
    import scipy 
    from scipy.optimize import curve_fit

    def func(x,a,b,c):
          return a+b*x[0]**2+c*x[1]
    x_0=np.array([1,2,3,4])
    x_1=np.array([5,6,7,8])
    X=scipy.array([x_0,x_1])
    Y=func(X,3.1,2.2,2.1)
    popt, pcov=curve_fit(func,X,Y)

实际代码:

    f=open("Exp_Fresnal.csv", 'rb')
    reader=csv.reader(f)
    for row in reader:
         Qz.append(row[0])
         Ref.append(row[1])
         Ref_F.append(row[2])
    Qz_arr,Ref_Farr=scipy.array((Qz)),scipy.array((Ref_F))
    x=scipy.array([Qz_arr,Ref_Farr]

    def func(x,d,sig_int,sig_cp):
         return x[1]*(x[0]*d*(math.exp((-sig_int**2)*(x[0]**2)/2)/(1-cmath.exp(complex(0,1)*x[0]*d)*math.exp((-sig_cp**2)*(x[0]**2)/2))))**2

    Y=scipy.array((Ref))
    popt, pcov=curve_fit(func,x,Y)

编辑 这是完整的错误信息

Traceback (most recent call last): File "DCM_03.py", line 46, in <module> popt, pcov=curve_fit(func,x,Y) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 651, in curve_fit res = leastsq(func, p0, args=args, full_output=1, **kwargs) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 377, in leastsq shape, dtype = _check_func('leastsq', 'func', func, x0, args, n) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 26, in _check_func res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 453, in _general_function return function(xdata, *params) - ydata File "DCM_03.py", line 40, in func return (0.062/(2*x))**4*(x*d*(math.exp((-sig_int**2)*(x**2)/2)/(1-cmath.exp(complex(0,1)*x*d)*math.exp((-sig_cp**2)*(x**2)/2))))**2 TypeError: only length-1 arrays can be converted to Python scalars

【问题讨论】:

  • 如果没有Exp_Fresnal.csv 字段,您的代码示例将无法运行。您能否提供此文档或不依赖外部文件的代码?
  • 我认为我不能将文档文件附加到问题中,它基本上只是 3 列数据,每列 155 行。此外,测试代码不需要任何文档即可运行。我包含了实际代码,因为测试代码有效,但实际代码无效。我不确定这是否与我导入数据的方式有关?
  • 显示完整错误。应该包含更多的信息。 Y=func(X,3.1,2.2,2.1) 这行看起来很可疑。
  • @Charco 的回答:math.exp() 只接受一个数字,而 numpy.exp() 可以接受一个数组。

标签: math scipy curve-fitting model-fitting


【解决方案1】:

我发现了这个问题。出于某种原因,问题是在拟合函数func 中使用了math.expcmath.exp。我用np.exp() 代替了这些功能。我不完全确定原因。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2022-11-22
    • 1970-01-01
    • 2020-10-29
    • 2021-09-25
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多