在numpy数组中找到长度N的范围,其中满足某些条件

时间:2015-11-13 09:54:39

标签: python arrays numpy

我有一个(numpy)数组代表一条测量曲线。我正在寻找第一个索引i,后面的N元素满足某些条件,例如在特定的范围内。在伪代码字中,我正在寻找最小i,以便

lower_bound < measurement[i:i+N] < higher_bound

对范围内的所有元素都满意。

当然,我可以做到以下几点:

for i in xrange(len(measurement) - N):
    test_vals = measurement[i:i + N]
    if all([True if lower_bound < x < higher_bound else False for x in test_vals]):
        return i

这是非常无效的,因为我总是比较每N的{​​{1}}值。 实现这一目标的最pythonic方法是什么? Numpy有一些内置功能可以找到它吗?

修改 根据请求,我提供了一些示例输入数据

i

应从a = [1,2,3,4,5,5,6,7,8,5,4,5] lower_bound = 3.5 upper_bound = 5.5 N = 3 开始返回3元素在至少3个值的范围内。

3 个答案:

答案 0 :(得分:3)

一个NumPythonic矢量化解决方案是在作为2D数组堆叠的输入数组measurement的整个长度上创建滑动窗口,然后使用这些索引索引到数组中以形成{{1的2D数组版本}}。接下来,在绑定检查后,一次性查找绑定成功measurement。最后选择第一个成功索引作为输出。实施将沿着这些方向发展 -

np.all(..axis=1)

示例运行 -

m2D = measurement[np.arange(N) + np.arange(len(measurement)-N+1)[:,None]]
np.nonzero(np.all((lower_bound < m2D) & (higher_bound > m2D),axis=1))[0][0]

答案 1 :(得分:2)

如果M是a的长度,这里是O(M)解。

locations=(lower_bound<a) & (a<upper_bound)
cum=locations.cumsum()
lengths=np.roll(cum,-N)-cum==N
result=lengths.nonzero()[0][0]+1

答案 2 :(得分:0)

这个答案可能会对你有所帮助,虽然它不是专门用于numpy:

What is the best way to get the first item from an iterable matching a condition?