Python Numpy:根据值的顺序将数组拆分为多个部分
我拥有的是一个大的numpy一维np.int16数组,包含数据和一个布尔数组,它存储数据的特定样本(长度为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)
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
是可能的。谢谢。我一直在寻找这样一种矢量化计算方法。