我正在通过Marcos Duarte's peak detector并理解每一行,除了他检测到比最小峰距更近的小峰的那一部分:
if ind.size and mpd > 1:
ind = ind[np.argsort(x[ind])][::-1] # sort ind by peak height
idel = np.zeros(ind.size, dtype=bool)
for i in range(ind.size):
if not idel[i]:
# keep peaks with the same height if kpsh is True
idel = idel | (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) \
& (x[ind[i]] > x[ind] if kpsh else True)
idel[i] = 0 # Keep current peak
# remove the small peaks and sort back the indices by their occurrence
ind = np.sort(ind[~idel])
尤其是我不明白这一行:
idel = idel | (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) \
& (x[ind[i]] > x[ind] if kpsh else True)
我了解他按峰高对峰阵列(ind
)进行排序,并创建了一个相同大小的布尔数组,并使用错误的值对其进行了初始化。然后,他遍历idel
数组,首先检查当前值是否为0(假)。
我分别对下一行进行了不同的布尔比较,但是无法弄清楚他如何使用mpd
,因为他在数组和元素级别都在使用ind
。有人可以快速给我解释一下吗?我被困在这一点上。
谢谢!
答案 0 :(得分:1)
请记住,kpsh
是覆盖mpd
的选项。通常,如果选择mpd
,则在给定长度2*mpd
的任何给定段中只能看到一个峰。但是,如果选择kpsh
,则共享相同高度的峰将成为例外,因为这是平局情况。
现在,让我们对其进行分析:
(ind >= ind[i] - mpd) & (ind <= ind[i] + mpd)
部分检查ind
的FOR EACH元素是否在mpd
的{{1}}附近,因此它将返回一个布尔数组,其大小与ind[i]
。我将其称为ind
。假设一秒钟没有arr_mpd
。 kpsh
将返回idel | arr_mpd
,返回索引True
,其中i
已经在其附近定义了一个峰值。因此,由于稍后将ind[i]
设置为ind[i]
会丢弃idel[i]
,TRUE
将负责删除它们。
现在,让我们集中讨论ind = np.sort(ind[~idel])
。我将其称为(x[ind[i]] > x[ind] if kpsh else True)
。
arr_kpsh
使kpsh==False
组成arr_kpsh
个数组。由于正在使用True
进行按位或运算,因此&
立即等于arr_mpd & arr_kpsh
,因此当arr_mpd
时arr_kpsh
无效。kpsh==False
是发生魔术的地方。 kpsh==True
逐元素检查与x[ind[i]] > x[ind]
对应的峰的值是否大于到目前为止找到的任何其他峰索引。如果是这种情况,则意味着它的高度不同(不需要检查直接相等性,因为峰值只能更大)。但是,如果不更大,则意味着存在另一个具有相同高度的峰。这会覆盖ind[i]
至arr_mpd & arr_kpsh
上的该元素。如果在False
中该元素也是假的,那么它将被保留,从而在idel
时保持相同的高度。我希望这对您有帮助