峰值检测器-检测小峰值

时间:2018-12-07 17:27:42

标签: python numpy

我正在通过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。有人可以快速给我解释一下吗?我被困在这一点上。

谢谢!

1 个答案:

答案 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_mpdkpsh将返回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)

  • 情况1:arr_kpsh使kpsh==False组成arr_kpsh个数组。由于正在使用True进行按位或运算,因此&立即等于arr_mpd & arr_kpsh,因此当arr_mpdarr_kpsh无效。
  • 情况2:kpsh==False是发生魔术的地方。 kpsh==True逐元素检查与x[ind[i]] > x[ind]对应的峰的值是否大于到目前为止找到的任何其他峰索引。如果是这种情况,则意味着它的高度不同(不需要检查直接相等性,因为峰值只能更大)。但是,如果不更大,则意味着存在另一个具有相同高度的峰。这会覆盖ind[i]arr_mpd & arr_kpsh上的该元素。如果在False中该元素也是假的,那么它将被保留,从而在idel时保持相同的高度。

我希望这对您有帮助