我拥有的是一个大的numpy一维np.int16数组,带有数据和一个布尔数组,用于存储特定样本(数据为samplesize
长)的信息符合某些标准(有效)或不合适(无效)。
我的意思是我有这样的事情:
samplesize = 5
data = array([1, 2, 3, 4, 5, 3, 2, 1, 3, 2, 4, 5, 2, 1, 1], dtype=int16)
membership = array([False, True, False], dtype=bool)
此处membership[0]
标识data[ 0*samplesize : 1*samplesize ]
是否有效。
我想要的是是根据成员资格数组中True
值的顺序将数据数组拆分为数据块。例如,如果membership
包含三个或更多连续True
语句,则会做出决定,即它是data
的有意义样本。
示例
True, True, True , True - valid sequence
True, True, False, True , True - invalid sequece
假设我们已将i
- 有效序列的开头标识为start[i]
并将此类序列的结尾标识为end[i]
,我想要分割{ {1}}数组从data
开始,最后到start[i] * samplesize
。
我怎么能做到这一点?
答案 0 :(得分:2)
我不明白你的问题。你想要开始& membership
的结束索引,连续3个或更多真?
以下是执行此操作的代码,基本思路是diff(membership)
,并获取上升沿和下降沿的索引:
import numpy as np
membership = np.random.randint(0, 2, 100)
d = np.diff(np.r_[0, membership, 0])
start = np.where(d == 1)[0]
end = np.where(d == -1)[0]
mask = (end - start) >= 3
start = start[mask]
end = end[mask]
for s, e in zip(start, end):
print s, e, membership[s:e]