3

シーケンスのセグメンテーションを表す文字列の 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]

正直なところ、これは問題なく動作しますが、これを実現するためのベクトル化された方法はありますか?

4

2 に答える 2

1

ソートされた検索はここで役立ちます:

>>> y
array(['B', 'I', 'I', 'O', 'B', 'I', 'O', 'O', 'B', 'O'],
      dtype='|S1')
>>> start=np.where(y=='B')[0]
>>> end=np.where(y=='O')[0]

>>> end[np.searchsorted(end,start)]-start
array([3, 2, 1])

別のアプローチ:

>>> mask=np.concatenate(([True],(np.diff(end)!=1)))
>>> mask
array([ True,  True, False,  True], dtype=bool)
>>> end[mask]-start
array([3, 2, 1])
于 2013-07-29T16:57:47.603 に答える