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

2024-09-26 18:06:53 发布

您现在位置:Python中文网/ 问答频道 /正文

A为1D numpy数组、阈值t、窗口长度K。你知道吗

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

我尝试过(未完成的)循环,但它似乎远远不是最佳的,我想也许有一个聪明的“numpy方式”来做到这一点。你知道吗


旁注:我们要测试的事实是,在特定的窗口长度期间,我们是否低于阈值,而不是实际值,有助于避免阈值附近的开/关/开/关/开/关伪影(另请参见Hysteresis“磁滞有意添加到电子电路中,以防止不必要的快速切换[…]补偿开关中的触点反弹或电信号中的噪声。”)。你知道吗


Tags: numpy宽度方式阈值数组噪声事实电信号
1条回答
网友
1楼 · 发布于 2024-09-26 18:06:53

进近#1

我们可以用1D convolution-

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

其思想是在与阈值进行比较之后得到布尔数组,然后使用长度与window相同的内核运行1D卷积,并填充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获取索引,最后选择第一个索引。我们需要将argorigin与二进制代码一起使用,以便选择开始。你知道吗

进近#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]

相关问题 更多 >

    热门问题