gpt4 book ai didi

python - 找到数组低于特定阈值的第一个索引(并保持低于一段时间)

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:35 25 4
gpt4 key购买 nike

A是一维 numpy 数组,阈值 t , 和窗口长度 K .

如何找到最小索引 j , 这样 A[j:j+K] < t ?(即 A 第一次在宽度为 K 的完整窗口上保持在阈值以下)。

我已经尝试过(未完成的)带有循环的事情,但它似乎远非最佳,我想也许有一种聪明的“numpy 方式”来做到这一点。


旁注:我们想要测试我们是否低于阈值在特定窗口长度而不是 ponctual 值,这一事实对于避免开/关/开/关/开/关很有用阈值附近的人工制品(另请参阅 Hysteresis:“有意将滞后添加到电子电路中以防止不需要的快速切换 [...] 补偿开关中的触点弹跳或电信号中的噪声。”).

最佳答案

方法 #1

我们可以使用一维卷积 -

np.flatnonzero(np.convolve(A<t, np.ones(K,dtype=int))==K)[0]-K+1

想法是在与阈值比较后得到 bool 数组,然后运行一个1D卷积,内核的长度与window相同,填充1s 。这给了我们每个滑动窗口的总和。因此,所有总和为 K 的窗口都是我们要查找的窗口。使用 flatnonzero 获取有效窗口的起始索引。最后,选择第一个。

方法 #2

使用二进制侵 eclipse -

from scipy.ndimage.morphology import binary_erosion

np.flatnonzero(binary_erosion(A<t, np.ones(K), origin=-(K//2)))[0]

这将运行一个长度与 window 相同的滑动内核,并侵 eclipse 掉所有不具有 window 长度的窗口 True序列,留给我们有效的序列。同样,使用 flatnonzero 获取索引并最终选择第一个。我们需要将 arg origin 与二进制侵 eclipse 一起使用,以便我们选择起点。

方法 #3

这是另一个岛屿发现 -

# Get mask of valid elements with comparison against thresh
mask = np.r_[False,A<t,False]

# Get indices of starts and ends for the valid islands
idx = np.flatnonzero(mask[:-1] != mask[1:])
start,stop = idx[::2],idx[1::2]

# Get the island lengths and check for lengths >=K and mask start indices
# and select the first one among them
out = start[(stop - start)>=K][0]

关于python - 找到数组低于特定阈值的第一个索引(并保持低于一段时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52189433/

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