找到阵列低于某个阈值的第一个索引(并保持在一段时间以下)

Bas*_*asj 3 python arrays numpy windowing threshold

A是一维numpy的阵列,阈值t,以及一个窗口长度K.

如何找到最小指数j,这样A[j:j+K] < t(即第一次A 在宽度为K的整个窗口上保持低于阈值).

我已经尝试了(未完成的)循环,但它似乎远非最佳,我想也许有一个聪明的"numpy方式"来做它.


旁注:我们要测试我们是否低于阈值的事实某个窗口长度中,而不是ponctual值,可以有效避免开启/关闭/开启/关闭/开启阈值附近的开/关的文物(见迟滞:"故意将滞后添加到电子电路中,以防止不必要的快速切换补偿开关中的触点反弹或电信号中的噪声.").

Div*_*kar 5

方法#1

我们可以用1D convolution-

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

我们的想法是在与阈值进行比较后获取布尔数组,然后1D使用长度与window填充的内核相同的内核运行卷积1s.这给了我们每个滑动窗口的总和.因此,所有具有总和的窗口K都是我们追求的窗口.使用flatnonzero获得的起始指数的有效窗口.最后,选择第一个.

方法#2

随着binary-erosion-

from scipy.ndimage.morphology import binary_erosion

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

这会运行一个长度相同的滑动内核,window并且会逐渐消除所有没有window长度True的窗口,让我们留下有效的窗口.再次,用于flatnonzero获取索引,最后选择第一个.我们需要使用origin具有二进制侵蚀的arg ,以便我们选择开始.

方法#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]
Run Code Online (Sandbox Code Playgroud)