我正在用 Python 编写一个程序,该程序正在处理实验期间生成的一些数据,它需要估计数据的斜率。我已经编写了一段代码,可以很好地做到这一点,但是速度非常慢(而且我不是很有耐心)。让我解释一下这段代码是如何工作的:
1)它抓取一小块大小为 dx 的数据(从 3 个数据点开始)
2) 评估差值(即 |y(x+dx)-y(x-dx)| )是否大于某个最小值(40x std.dev. of noise)
3)如果差异足够大,它将使用OLS回归计算斜率。如果差值太小,会增加 dx 并用这个新的 dx 重做循环
4) 这对所有数据点都继续
[进一步查看更新的代码]
对于大约 100k 次测量的数据大小,这大约需要 40 分钟,而程序的其余部分(它执行的处理比这更多)大约需要 10 秒。我敢肯定有一种更有效的方法来进行这些操作,你们能帮帮我吗?
谢谢
编辑:
好的,所以我通过仅使用二进制搜索解决了问题,将允许的步骤数限制为 200。我感谢大家的输入,我选择了对我帮助最大的答案。
最终更新代码:
def slope(self, data, time):
(wave1, wave2) = wt.dwt(data, "db3")
std = 2*np.std(wave2)
e = std/0.05
de = 5*std
N = len(data)
slopes = np.ones(shape=(N,))
data2 = np.concatenate((-data[::-1]+2*data[0], data, -data[::-1]+2*data[N-1]))
time2 = np.concatenate((-time[::-1]+2*time[0], time, -time[::-1]+2*time[N-1]))
for n in xrange(N+1, 2*N):
left = N+1
right = 2*N
for i in xrange(200):
mid = int(0.5*(left+right))
diff = np.abs(data2[n-mid+N]-data2[n+mid-N])
if diff >= e:
if diff < e + de:
break
right = mid - 1
continue
left = mid + 1
leftlim = n - mid + N
rightlim = n + mid - N
y = data2[leftlim:rightlim:int(0.05*(rightlim-leftlim)+1)]
x = time2[leftlim:rightlim:int(0.05*(rightlim-leftlim)+1)]
xavg = np.average(x)
yavg = np.average(y)
xlen = len(x)
slopes[n-N] = (np.dot(x,y)-xavg*yavg*xlen)/(np.dot(x,x)-xavg*xavg*xlen)
return np.array(slopes)