シーケンスのセグメンテーションを表す文字列の NumPy 配列があります。B
関心のあるセグメントの開始、I
その継続、O
セグメント外です。たとえば、次の配列には、関心のある 3 つのセグメントがあります。
>>> y
array(['B', 'I', 'I', 'O', 'B', 'I', 'O', 'O', 'B', 'O'],
dtype='|S1')
で始まるセグメントを簡単に見つけることができますnp.where(y == "B")[0]
。しかし今、私はセグメントの長さ、つまり に等しい最長のプレフィックスの長さも見つけようとしていますI
。私はそれを使用して行うことができますitertools.takewhile
:
>>> from itertools import takewhile
>>> lengths = [1 + sum(1 for _ in takewhile(lambda x: x == "I", y[start + 1:]))
... for start in np.where(y == "B")[0]]
>>> lengths
[3, 2, 1]
正直なところ、これは問題なく動作しますが、これを実現するためのベクトル化された方法はありますか?