查找数组低于某个阈值的第一个索引(并保持低于该值一段时间)

时间:2018-09-05 16:07:22

标签: python arrays numpy threshold windowing

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

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

我已经尝试过(未完成)循环的事情,但这似乎远非最佳,而且我认为也许有一个聪明的“麻木方法”来做到这一点。


旁注:我们想要测试在一定的窗口长度内是否低于阈值 而不是总值的事实,有助于避免开/关/开/关/开/关接近阈值的伪像(另请参见Hysteresis“有意将磁滞现象添加到电子电路中,以防止意外的快速开关来补偿开关中的触点弹跳或电信号中的噪声。” )。

1 个答案:

答案 0 :(得分:5)

方法1

我们可以使用1D convolution-

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

这个想法是在与阈值比较之后获得布尔数组,然后运行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]

这会运行一个长度与window相同的滑动内核,并依次侵蚀所有没有window长度True的窗口,从而为我们留出有效的窗口。同样,使用flatnonzero获取索引,最后选择第一个。我们需要将arg origin与二进制侵蚀一起使用,以便我们选择开始位置。

方法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]