python求梯形面积_Python:使用梯形法则快速计算平均值

使用Python,我必须处理一些数据。

在大约一千万个时间点,我得到了大约50个函数的值。这些值以2D列表形式给出matrix,即matrix[i]是值列表

[t_i, value of f1 at t_i, value of f2 at t_i ..., value of fN of t_i]

在哪里N = 50。

由于

数据中可能的噪声(功能为一些测量值)

非等时的时间点(有时,时间步长为几秒钟,但有时可以以天为单位)

我决定使用在固定长度的一些预定义时间间隔上给定值的平均值的值。

我尝试了不同长度的间隔:它们介于一分钟到一小时之间。

我计算平均值的算法如下:

matrix=...# read matrixt0=matrix[0][0]ts_new=[t0+i*time_stepforiinrange(some_bound)]buckets=[[]fortints_new]fori,instanceinenumerate(matrix):t_i=instance[0]put i to the bucketwithindex j,such that ts_new[j]<=t_i

该算法的瓶颈是最后一个for循环。

如果我转换matrix成numpy.array与计算的平均值bucket为matrix[bucket, :].mean(axis=0),蛮快的这个作品,但是计算的值没有太大的意义:

如果f1at的值ts = [0, 99, 100]分别为ys = [0, 0, 2],则均值函数将返回2/3(按预期)。但是,的平均值f1应该更接近0。使用梯形法则,将获得的平均值0.01,这更有意义。

所以,目前,我正在使用

所述scipy.integrate.trapz用于计算平均值的桶的方法,包括:梯形的面积由间隔长度除以

scipy.interpolate.interp1d一种获取f间隔边界处的函数值的方法,例如,我使用上一个存储桶中的最后一个点和给定存储桶中的第一个点,以计算相应时间间隔开始时的值(对于结束时间类似)时间间隔)

需要第二个项目符号,因为分钟间隔时间太短,以至于有时存储桶中只有1或2个点。该过程如下:

# for one bucketmeans=[0forcolinrange(N)]forcolinrange(1,N+1):# for each function fxs=[]ys=[]ifcan_interpolate_at_start:f_lin=scipy.interpolate.interp1d([tPrevLast,tNowFirst],[yPrevLast,yNowFirst])xs.append(t_bucketStart)ys.append(f_lin(t_bucketStart))xs+=matrix[bucket,0]ys+=matrix[bucket,col]ifcan_interpolate_at_end:# ...means[col-1]=scipy.integrate.trapz(ys,xs)/(xs[-1]-xs[0])

的值can_interpolate_at_start与can_interpolate_at_end仅取决于时间差距(但必须特别注意采取的第一个和最后一个桶...):我不使用插值点,如果在之前的桶之间,例如,最近点的时间差并且当前存储桶太大。

我的问题是:当前的方法确实很慢(每隔一分钟的时间间隔大约两个小时)。我怎样才能使其更快?

解决方案

您可以做的一件简单的事情是,根据间隔进行思考,取每个间隔的每个函数的平均值,然后乘以间隔长度,然后除以总时间:

importnumpyasnp

matrix=...data=np.asarray(matrix)t_diff=np.diff(data[:,0])means_sum=np.sum(t_diff[:,np.newaxis]*(data[:-1,1:]+data[1:,1:])/2,axis=0)means=means_sum/(data[-1,0]-data[0,0])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值