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

2024-09-28 17:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表示测量曲线的数组。我在寻找第一个索引i,随后的N元素满足某些条件,例如位于特定边界内。在伪代码中,我在寻找最小的i,这样

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

满足范围内所有元素的要求。在

当然,我可以做以下事情:

^{pr2}$

这是非常低效的,因为我总是比较每个iN值。 什么是最Python式的方法来实现这一点?Numpy有一些内置的功能来找到这个吗?在

编辑: 根据请求,我提供了一些示例输入数据

a = [1,2,3,4,5,5,6,7,8,5,4,5]
lower_bound = 3.5
upper_bound = 5.5 
N = 3

应返回3,因为从a[3]开始,元素至少在3个值的范围内。在


Tags: 方法代码numpy元素数组条件事情lower
3条回答

一个NumPythonic矢量化解决方案是在作为二维数组堆叠的输入数组measurement的整个长度上创建滑动窗口,然后用这些索引索引到数组中,以形成measurement的2D数组版本。接下来,在绑定检查后使用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]

样本运行-

^{pr2}$

如果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

相关问题 更多 >