web-dev-qa-db-ja.com

numpy配列で1秒のすべてのシーケンスの最初と最後のインデックスを抽出し、それらをリストに追加しますか?

1秒と0を含むオーディオファイル(時系列)のマスクベクトルがあります。マスクベクトルは、音声信号内の間隔に対して長いシーケンスが、いくつかの有利なアクティビティがあるとき、およびノイズがあるときに0Sを含む。私は基本的にオーディオ信号からすべてのアクティビティ部分を抽出し、それらを別々のオーディオファイルと保存したいです。このため、マスクベクトルから1Sのすべてのシーケンスの開始インデックスとエンドインデックスを抽出する最も効率的な方法を見つけて、それらをリストに追加することは役立ちます。

1
Burooj Ghani

私はこのようなことをするでしょう:

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の各グループを終了し、次に元のデータフレームの一部である)各グループをループする。

0
user17242583

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-258-9に3つの別々の時間が表示されます。

[array([0, 2], dtype=int64),
 array([5, 5], dtype=int64),
 array([8, 9], dtype=int64)]
0
Manlai A