pylabプログラム(おそらくmatlabプログラムでもある可能性があります)では、距離を表す数値のnumpy配列があります:時間d[t]
の距離ですt
(データのタイムスパンはlen(d)
時間単位です)。
私が興味を持っているイベントは、距離が特定のしきい値を下回ったときであり、これらのイベントの期間を計算したいと考えています。を使用してブール値の配列を取得するのは簡単ですがb = d<threshold
、問題は の True のみの単語の長さのシーケンスを計算することになりますb
。しかし、私はそれを効率的に行う方法を知りません (つまり、numpy プリミティブを使用します)。配列をウォークし、手動で変更を検出することに頼りました (つまり、値が False から True になったときにカウンターを初期化し、値が True である限りカウンターを増やします)。値が False に戻ったときにシーケンスにカウンタを出力します)。しかし、これは非常に遅いです。
numpy 配列でそのようなシーケンスを効率的に検出するにはどうすればよいですか?
以下は私の問題を説明するいくつかの python コードです: 4 番目のドットが表示されるまでに非常に長い時間がかかります (そうでない場合は、配列のサイズを増やしてください)。
from pylab import *
threshold = 7
print '.'
d = 10*rand(10000000)
print '.'
b = d<threshold
print '.'
durations=[]
for i in xrange(len(b)):
if b[i] and (i==0 or not b[i-1]):
counter=1
if i>0 and b[i-1] and b[i]:
counter+=1
if (b[i-1] and not b[i]) or i==len(b)-1:
durations.append(counter)
print '.'