Numpy:根据值的顺序将数组拆分为多个部分

时间:2014-11-30 09:29:59

标签: python numpy split seq

我拥有的是一个大的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

我怎么能做到这一点?

1 个答案:

答案 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]