1秒と0を含むオーディオファイル(時系列)のマスクベクトルがあります。マスクベクトルは、音声信号内の間隔に対して長いシーケンスが、いくつかの有利なアクティビティがあるとき、およびノイズがあるときに0Sを含む。私は基本的にオーディオ信号からすべてのアクティビティ部分を抽出し、それらを別々のオーディオファイルと保存したいです。このため、マスクベクトルから1Sのすべてのシーケンスの開始インデックスとエンドインデックスを抽出する最も効率的な方法を見つけて、それらをリストに追加することは役立ちます。
私はこのようなことをするでしょう:
groups = df.groupby(df['your_col'].ne(df['your_col'].shift(1)).cumsum()[df['your_col'].eq(1)])
for _, group in groups:
# At this point, 'group' is a separate dataframe containing all the rows where 'your_col' is consecutively 1
# ...
_
基本的にそれはそれが連続した1sによって行をグループ化することです(1つ以上のゼロの各グループは1Sの各グループを終了し、次に元のデータフレームの一部である)各グループをループする。
data
を考えると、1にインデックス付けすることでidx
を作成し、np.split
を使用して連続したインデックスのサブアレイに分割できます。
data = pd.Series([1,1,1,0,0,1,0,0,1,1])
idx = data[data==1].index.values
out = [arr[[0,-1]] for arr in np.split(idx, np.where(np.diff(idx) != 1)[0]+1)]
そのため、この例では、1はインデックス0-2
、5
と8-9
に3つの別々の時間が表示されます。
[array([0, 2], dtype=int64),
array([5, 5], dtype=int64),
array([8, 9], dtype=int64)]