当前位置: 首页 > 面试题库 >

scipy curve_fit不喜欢数学模块

曾洲
2023-03-14
问题内容

在尝试创建一个示例时,scipy.optimize curve_fit我发现scipy似乎与Python的math模块不兼容。虽然功能f1正常,但f2会引发错误消息。

from scipy.optimize import curve_fit
from math import sin, pi, log, exp, floor, fabs, pow

x_axis = np.asarray([pi * i / 6 for i in range(-6, 7)])  
y_axis = np.asarray([sin(i) for i in x_axis])

def f1(x, m, n):
    return m * x + n

coeff1, mat = curve_fit(f1, x_axis, y_axis)    
print(coeff1)

def f2(x, m, n):
    return m * sin(x) + n

coeff2, mat = curve_fit(f2, x_axis, y_axis)  
print(coeff2)

完整的追溯是

Traceback (most recent call last):
  File "/Documents/Programming/Eclipse/PythonDevFiles/so_test.py", line 49, in <module>
    coeff2, mat = curve_fit(f2, x_axis, y_axis)
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 742, in curve_fit
    res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 377, in leastsq
    shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 26, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 454, in func_wrapped
    return func(xdata, *params) - ydata
  File "/Documents/Programming/Eclipse/PythonDevFiles/so_test.py", line 47, in f2
    return m * sin(x) + n 
TypeError: only length-1 arrays can be converted to Python scalars

出现错误消息,并带有列表和numpy数组作为输入。它会影响math我测试过的所有功能(请参阅导入中的功能),并且必须与数学模块如何处理输入数据有关。这对于pow()函数最为明显-
如果我不从中导入该函数math,则curve_fit可以与之正常工作pow()

显而易见的问题-为什么会发生这种情况?如何math与函数一起使用curve_fit

PS:请不要讨论,不应以线性拟合来拟合样本数据。选择它只是为了说明问题。


问题答案:

小心numpy-arrays,对数组进行操作和对标量进行操作!

Scipy
Optimizer假定输入(初始点)是一维数组,在其他情况下通常会出错(例如,列表变成数组,如果您假设要处理列表,则事情会变得很混乱;这类问题是这在StackOverflow上很常见,调试起来并不是一件容易的事;代码交互很有帮助!)。

import numpy as np
import math

x = np.ones(1)

np.sin(x)
> array([0.84147098])

math.sin(x)
> 0.8414709848078965                     # this only works as numpy has dedicated support
                                         # as indicated by the error-msg below!
x = np.ones(2)

np.sin(x)
> array([0.84147098, 0.84147098])

math.sin(x)
> TypeError: only size-1 arrays can be converted to Python scalars

老实说:这是对numpy的非常基本的了解的一部分,在使用scipy的某些敏感函数时应该理解。



 类似资料:
  • 问题内容: 是否可以在一个查询中将多个SQL LIKE通配符串在一起-像这样? 目的是查找同时包含通配符但没有特定顺序的记录。 问题答案: 正确的SQL语法是:

  • 喜欢资讯 取消喜欢资讯 资讯喜欢列表 喜欢资讯 POST /news/{news}/likes Response Headers Status: 201 Created 取消喜欢资讯 DELETE /news/{news}/likes Response Headers Status: 204 No Content 资讯喜欢列表 GET /news/{news}/likes Respons

  • 点喜欢 取消喜欢 喜欢的人列表 点喜欢 POST /feeds/:feed/like Response Status: 201 Created { "message": [ "操作成功" ] } 通知类型 { "channel": "feed:digg", // 通知关键字 "target": 325, // 动态id "content": "@2222 点喜欢了

  • 我在PostgresQL中有一个表feed_item_likes_dislikes(feed_item_id,user_id,vote),其中 feed_item_id是uuid 用户id为整数 投票=正确那么这是一个类似 投票=FALSE那么这是一种厌恶 vote=NULL表示用户最初喜欢或不喜欢,但通过取消通知返回并删除了投票 我还有另一个表feed_item_likes_dislikes_a

  • 问题内容: 我当前的查询如下所示: 我环顾四周,找不到类似于LIKE IN()的东西-我认为它的工作方式如下: 有任何想法吗?我只是以错误的方式思考问题-一些我从未见过的晦涩命令。 MySQL 5.0.77-社区日志 问题答案: 一个REGEXP 可能 会更有效,但你必须对它进行基准测试,以确保,如

  • 帖子喜欢列表 帖子喜欢 帖子取消喜欢 帖子喜欢列表 GET /group-posts/:post/likes 参数 名称 类型 说明 limit integer 默认 15 ,数据返回条数 默认为15 after integer 默认 0 ,翻页标识。 响应 status 200 [ { "id": 152, "user_id": 1,// 攒点用户 "targe