我有一个(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个值的范围内。
答案 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?