python - scipy optimize.curve_fit 无法拟合其返回值取决于条件的函数

标签 python python-2.7 scipy

我想将定义如下的函数拟合到时间序列数据:

def func(t, a0, a1, a2, T, tau1, tau2):
    if t < T:
        return a0 + a1 * np.exp(-t/tau1) + a2 * np.exp(-t/tau2)
    else:
        return a0 + a1 * np.exp(-T/tau1) * (1 - t/tau1 + T/tau1) + a2 * np.exp(-T/tau2) * (1 - t/tau2 + T/tau2) 

这里,t代表进行测量的时间,其余参数为函数的参数。问题是当我将它输入 curve_fit 时,Python 提示 t < T 比较中的歧义。我相信发生这种情况是因为当在 curve_fit 中调用 func 时 t 变成了数据点列表,而 T 是一个数字(不是列表):

popt, pcov = curve_fit(func, t1, d1)

其中 t1 是时间列表,d1 是相应时间测量的数据值列表。我尝试了多种方法来解决这个问题,但都无济于事。有什么建议吗?非常感谢!

最佳答案

没错,t < T是一个 bool 数组。 NumPy 拒绝为 bool 数组分配真值,因为有很多可能的选择——如果所有 元素为真,还是如果任何 元素为真,它应该为真?

不过没关系。在这种情况下,NumPy 提供了一个很好的函数来替换 if ... else ... block ,即 np.where :

def func(t, a0, a1, a2, T, tau1, tau2):
    return np.where(
        t < T,
        a0 + a1 * np.exp(-t/tau1) + a2 * np.exp(-t/tau2),
        a0 + a1 * np.exp(-T/tau1) * (1 - t/tau1 + T/tau1) + a2 * np.exp(-T/tau2) * (1 - t/tau2 + T/tau2) )

关于python - scipy optimize.curve_fit 无法拟合其返回值取决于条件的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314699/

相关文章:

python - 在Python中读取具有不同长度列的.csv文件作为字典

python - 你如何在情节图例中显示文本标签? (例如,删除图例中的标签线)

python - Python 中 '\0\0' 的含义?

python - Ruby 的 ERB 类似 python 中的特性

Python 吉布斯采样器不工作

python - 访问 csr_matrix 中的特定行、列

python-2.7 - 科学Python和scipy之间的区别?

python - 未实现的 __init__()

python - 如何修剪列表并生成 numpy 二维数组?

Python DataFrame 连接特定列索引?