2016-09-26 19 views
1

私は、記録された期間内に起こったことの開始 - 終了時間(秒)のペアからなるデータセットを持っています。たとえば:時間間隔/間隔を複数のビンに分割する方法

#each tuple includes (start, stop) of the event happening 
data = [(0, 1), (5,8), (14,21), (29,30)] 

私はこの事は、私が望む任意のサイズのビンの中に何が起こっているか時間の割合定量化します。

  • にビンのサイズによって総イベントが発生した時間と除算を追加し、複数のビン
  • に渡るすべてのタプルを分割:私は5秒ごとのビンを望んでいた場合たとえば、私は希望の機能を希望します各ビンの間にタイムイベントが発生しました

私は主に最初の点に問題があります。

bin_timesは私が助けの書き込みを必要とする機能であり、出力は関数が返すものですどこ理想的には、それは次のようになります。

data = [(0, 1), (5,8), (15,21), (29,30)] 
bin_times(data, bin_size=5, total_length=40) 

>> [20, 60, 0, 100, 20, 20, 0, 0] 
+0

(15-21)(15,21)、つまりコンマではいけませんか? –

+0

申し訳ありません。ただそれを修正しました。 – Lina

+0

心配する必要はありません。 –

答えて

1

あなたがnumpyを使用して気にしない場合は、ここれます戦略:

import numpy as np 

def bin_times(data, bin_size, total_length): 
    times = np.zeros(total_length, dtype=np.bool) 
    for start, stop in data: 
     times[start:stop] = True 
    binned = 100 * np.average(times.reshape(-1, bin_size), axis=1) 
    return binned.tolist() 

data = [(0, 1), (5,8), (15,21), (29,30)] 
bin_times(data, 5, 40) 
// => [20.0, 60.0, 0.0, 100.0, 20.0, 20.0, 0.0, 0.0] 

私は小さい例を使用せ、bin_times()のロジックを説明するために:

data = [(0, 1), (3, 8)] 
bin_times(data, 3, 9) 
// => [33.3, 100.0, 66.6] 
  1. times配列は、各単位時間間隔でイベントが発生しているかどうかをエンコードします。あなたはFalseにすべてのエントリを設定することで起動します。

    [False, False, False, False, False, False, False, False, False] 
    
  2. の着信dataを読み、Trueに適切なエントリを回す:

    [True, False, False, True, True, True, True, True, False] 
    
  3. の長さの二次元マトリックスにそれをリシェイプ

    [[True, False, False], 
    [True, True, True], 
    [True, True, False]] 
    
  4. テイク:行がbin_sizeです各行の平均:100によって

    [0.333, 1.000, 0.666] 
    
  5. 乗算パーセントにこれらの番号をオンにする:に.tolist()方法を使用し、関数の消費者からnumpyの使用を非表示にする

    [33.3, 100.0, 66.6] 
    
  6. 結果のnumpy配列を平易なPythonリストに変換します。

1つの警告:均等に整形はそうValueErrorがスローされますtotal_length —を分割する必要がbin_sizeを。

関連する問題