我正在阅读一个包含两列数字数据的文件。设第一列为'x',第二列为'y'。
'x'中的数据不是均匀间隔的。也就是说,它是这样的:
2.4 2.6 2.7 3.0 3.2 3.5 ...
数据显然有限。它有一个初始值和一个最终值。
我需要在这些数据中找到“不连续性”。我想这样做是为了区分数据:dy / dx
我已经完成了搜索,但我发现的所有差异化答案都涉及分析函数,例如y = x ** 2 + 1
我的数据是离散的,不适合分析功能。我需要在这个数据的每个'x'值上找到导数,记住'x'不是均匀间隔。
所以,假设我已经从我的数据文件中读取数据,并将它们存储在变量'x'和'y'中。
现在我想要dy / dx,我想绘制dy / dx vs x。
我能做什么“导入”这个衍生物?或者我将不得不自己编写算法?
答案 0 :(得分:0)
我会自己写the algorithm。没有内置导入可以做到这一点。这里有一些代码用作起点:
>>> xarr = [2.4, 2.6, 2.7, 3.0, 3.2, 3.5, 3.8, 4.1, 5.3]
>>> yarr = [10, 12, 18, 20, 22, 27, 30, 32, 36]
>>> [(y2-y0)/(x2-x0) for x2, x0, y2, y0 in zip(xarr[2:], xarr, yarr[2:], yarr)]
[26.666666666666643, 20.000000000000004, 8.0,
14.0, 13.333333333333341, 8.333333333333337, 4.0]
您可以根据距离三个点中心的距离对每一侧进行加权来细化近似值,但如果你所做的只是寻找不连续性,这可能是不必要的。
答案 1 :(得分:0)
我写了一个简单的算法,将我的数组分成3个点的较小数组。然后通过这三个点拟合二阶函数,取其导数,并计算中间点的值。对于终点,我只使用两个值。
有点乱。我知道有更有效的方法来完成循环。这是我做的:
dydx=[]
for i in range(len(x)):
if i==0:
dx=x[i:i+2]
dy=y[i:i+2]
order=1
elif i==len(x)-1:
dx=x[i-1:i+1]
dy=y[i-1:i+1]
order=1
else:
dx=x[i-1:i+2]
dy=y[i-1:i+2]
order=2
z=np.polyfit(dx,dy,len(dx)-1)
f=np.poly1d(z)
df=np.polyder(f)
dydx.append(float(df(x[i])))
dydx=np.array(dydx)
有关清除此循环的任何建议都以消除if-elif语句的方式进行了吗?