実験中に生成されたデータを処理するプログラムをPythonで作成していますが、データの傾きを推定する必要があります。私はこれを非常にうまく行うコードを書きましたが、それはひどく遅いです(そして私はあまり辛抱強くありません)。このコードがどのように機能するかを説明しましょう。
1)サイズdxの小さなデータを取得します(3つのデータポイントから開始)
2)差(すなわち| y(x + dx)-y(x-dx)|)が特定の最小値(40x標準偏差のノイズ)よりも大きいかどうかを評価します。
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)