我有代表序列分段的 NumPy 字符串数组。B
是感兴趣的片段的开始,I
它的延续,O
在任何片段之外。例如,在以下数组中,有三个感兴趣的部分:
>>> 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]
老实说,哪个效果很好,但是有没有一种矢量化的方法来实现这一点?