2017-08-07 9 views
0

イベントが発生した時刻のリストがあります。私はこれをPythonでbinned times(例えば0 - 2秒、2 - 4秒など)のリストに変換したいと思います。時間内にPythonでビンに変換されたイベントに変換する

たとえば私は、イベントが起こった時に、次の時間がある場合:

event_times = [1,2,4,7,8,9] 

、次の時間の配列:

count = [0,2,1,0,2,1] 
:私は次の出力を期待

time = [0,2,4,6,8,10] 

は、0〜2秒の間に2つのイベントがあり、2〜4秒の間に1つのイベントがあることなどを示しています(includi上界)。最初のゼロは冗長です。常にゼロになるからです。

は、今私は働き、ループのための2つでこれを解決しますが、ひどく遅いです:あなたはこの使用numpyののhistogram機能を達成することができます

count = numpy.zeros(len(time)) 
for i in range(1,len(time)): 
    for j in range(len(event_times)): 
     if event_times[j] > time[i-1] and event_times[j] <= time[i]: 
      count[i] = count[i] + 1 

答えて

3

正確に予想される出力を取得(および神託-LY)、np.digitizenp.bincount

count = np.bincount(np.digitize(event_times, time, right = 1)) 

count 
Out[619]: array([0, 2, 1, 0, 2, 1], dtype=int32) 

np.histogramを使用するには機能しません。

1

。カウントされるリストまたは配列を受け入れ、ビン部門に渡すことができます。デフォルトでは、上限ではなくビン範囲の下限が含まれます。しかし、それは簡単に回避できます。

import numpy as np 
event_times = [1,2,4,7,8,9] 
time = [0,2,4,6,8,10] 

counts, bins = np.histogram(event_times, bins=time) 
counts 

#returns: 
array([1, 1, 1, 1, 2]) 

上限を含めるには、単にtimeに小さなオフセットを追加することができます。あなたが値をごまかすない限り、それは、左の制限を使用しているため

counts, bins = np.histogram(event_times, bins=np.array(time)+1e-10) 
counts 

#returns: 
array([2, 1, 0, 2, 1]) 
0

あなたはすでにnumpyを使用しているので、Daniel Fの答えはおそらくあなたが望むものです。何らかの理由であなたはそれを自分で実装するために探していると時間の配列が、それはあなたのif文で判断するように思えるの連続スパンを、表している場合、あなたは(n = len(event_times)用)O(n)に実行時間を短縮することができます

count = numpy.zeros(len(time)) 
for j in event_times: 
    count[int(numpy.ceil(j/2))] += 1 

time配列が0から開始しない場合は、適切なオフセットを減算するだけです。

関連する問題