【问题标题】:Numpy: split array into parts according to sequence of valuesNumpy:根据值的顺序将数组拆分为多个部分
【发布时间】:2014-11-30 09:29:59
【问题描述】:

我所拥有的是一个大的 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-th 有效序列的开头标识为start[i],并将此类序列的结尾标识为end[i],我想将data 数组拆分为多个片段从start[i] * samplesize 开始,最后到end[i] * samplesize

我怎么能做到这一点?

【问题讨论】:

  • 你已经用np.split尝试了什么,你的问题在哪里?
  • 我无法使用np.split,因为它只能按已知索引列表进行拆分。我需要通过分析membership 数组来找到分裂的边缘,这就是问题 - 如何找到连续True 语句的这些开始和结束索引。
  • 我也不能使用条件拆分。我想过itertools.groupby,但我很好奇是否有更有效的解决方案。
  • np.diff 应用到membership 怎么样?

标签: python numpy split seq


【解决方案1】:

我不明白你的问题。你想获得membership 的开始和结束索引与 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]

【讨论】:

  • 谢谢。我不知道mask = (end - start) >= 3 是可能的。非常感谢。我正在寻找这种矢量化计算方法。
猜你喜欢
  • 2018-01-24
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多