gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:43:20 31 4
gpt4 key购买 nike

我有一个代表测量曲线的 (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

这是非常低效的,因为我总是比较每个 iN 值。实现这一目标的最pythonic方法是什么? 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 个值在边界内。

最佳答案

一个 NumPythonic 向量化解决方案是在输入数组 measurement 的整个长度上创建滑动窗口,堆叠为二维数组,然后使用这些索引对数组进行索引以形成二维数组版本测量。接下来,在绑定(bind)检查后使用 np.all(..axis=1) 一次性查找绑定(bind)成功。最后选择第一个成功指标作为输出。实现将沿着这些路线进行 -

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]

sample 运行-

In [1]: measurement = np.array([1,2,3,4,5,5,6,7,8,5,4,5])
...: lower_bound = 3.5
...: higher_bound = 5.5
...: N = 3
...:

In [2]: m2D = measurement[np.arange(N) + np.arange(len(measurement)-N+1)[:,None]]

In [3]: m2D # Notice that is a 2D array (shifted) version of input
Out[3]:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 5],
[5, 5, 6],
[5, 6, 7],
[6, 7, 8],
[7, 8, 5],
[8, 5, 4],
[5, 4, 5]])

In [4]: np.nonzero(np.all((lower_bound < m2D) & (higher_bound > m2D),axis=1))[0][0]
Out[4]: 3

关于python - 在满足某些条件的 numpy 数组中查找长度 N 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33689953/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com