假设我想在我关闭灯光的数据中插入一条直线。现在我不小心把灯打开了,我的数据与数据点101之间的距离一直保持不变。
我怎么能适合这个?我试图为x加入一个条件,但是我得到了错误
ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()
请记住取消注释代码的其余部分(遇到错误)。
import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt
d1 = np.random.normal(0,0.1, 100)
d2 = np.random.normal(3,0.1, 100)
x = np.arange(0,200)
y = np.concatenate((d1,d2))
plt.plot(x, y)
# def line(x, a, b, offset):
# if x < 101:
# y = a * x + b
# else:
# y = (a * x + b) + offset
# return y
#
# popt, pcov = optimize.curve_fit(line, xdata = x, ydata = y)
#
# plt.plot(x, line(x, *popt), color = "firebrick")
plt.show()
我认为标准技巧是将布尔条件转换为整数因子:
def line(x, a, b, offset):
return (a * x + b) + offset * (x>100)
你得到这个错误的原因是optimize
通过传递line
值而不是单个值来调用你的array
函数。要解决此问题,您的line
函数必须能够处理一组值。幸运的是,numpy
有一个帮助你的功能。
def line(x, a, b, offset):
return np.piecewise(x,
[x < 101, x >= 101],
[lambda x: a * x + b, lambda x: a * x + b + offset])
我应该注意到它仍然没有收敛,但这是一个不同的问题。