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

Python Numpy:根据值的顺序将数组拆分为多个部分,python,numpy,split,seq,Python,Numpy,Split,Seq,我拥有的是一个大的numpy一维np.int16数组,包含数据和一个布尔数组,它存储数据的特定样本(长度为samplesizelong)是否符合某些标准(有效)或不符合(无效)的信息。 我的意思是我有这样的东西: 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)

我拥有的是一个大的numpy一维np.int16数组,包含数据和一个布尔数组,它存储数据的特定样本(长度为
samplesize
long)是否符合某些标准(有效)或不符合(无效)的信息。 我的意思是我有这样的东西:

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)
这里
成员身份[0]
标识
数据[0*样本大小:1*样本大小]
是否有效

我想要的是根据成员资格数组中
True
值的顺序将数据数组分割成块。例如,如果
membership
包含三个或三个以上的
True
连续语句,则决定它是
数据的有意义样本

示例

True, True, True , True - valid sequence 
True, True, False, True , True - invalid sequece
假设我们已经将
i
的有效序列的开头标识为
start[i]
,而这样一个序列的结尾标识为
end[i]
,我想将
数据
数组拆分为从
start[i]*samplesize
开始,最后到
end[i]*samplesize


我怎样才能做到这一点

我不明白你的问题。您是否希望以3个或更多连续的True获取
成员资格的开始和结束索引

下面是执行此操作的代码,基本思想是
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]

你已经用
np.split
尝试了什么?你的问题在哪里?我不能使用
np.split
,因为它只能按已知索引列表进行拆分。我需要通过分析
成员资格
数组来找到用于拆分的边,这就是问题所在-如何找到连续
True
语句的开始和结束索引。我也不能使用条件拆分。我曾考虑过
itertools.groupby
,但我很好奇是否有更有效的解决方案。将
np.diff
应用于
会员资格如何?谢谢。我不知道
mask=(end-start)>=3
是可能的。谢谢。我一直在寻找这样一种矢量化计算方法。