让A
是一维numpy数组,阈值t
和窗口长度K
。
如何找到最小索引j
,以使A[j:j+K] < t
?(即,第一次A在宽度为K的整个窗口中保持在阈值以下) )。
我已经尝试过(未完成)循环的事情,但这似乎远非最佳,而且我认为也许有一个聪明的“麻木方法”来做到这一点。
旁注:我们想要测试在一定的窗口长度内是否低于阈值 而不是总值的事实,有助于避免开/关/开/关/开/关接近阈值的伪像(另请参见Hysteresis:“有意将磁滞现象添加到电子电路中,以防止意外的快速开关来补偿开关中的触点弹跳或电信号中的噪声。” )。
答案 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]