<p>你的函数使用了很多参数。您可以将问题分解为几个步骤:</p>
<ol>
<li>首先检测阈值以上的所有点。将这些点添加到<code>maxthresh</code>和<code>minthresh</code>列表中。在</li>
<li>迭代<code>maxthresh</code>列表,如果点之前的y值小于该点,而该点之后的y值小于该点,则该点为峰值。在</li>
<li>迭代<code>minthresh</code>列表,如果点之前的y值大于该点,并且该点之后的y值大于该点,则该点为峰值。在</li>
</ol>
<p><strong>代码实现:</strong></p>
<pre><code>from math import sin
from matplotlib import pylab
from pylab import *
def peakdet(v, thresh):
maxthresh = []
minthresh = []
peaks = []
valleys = []
for x, y in v:
if y > thresh:
maxthresh.append((x, y))
elif y < -thresh:
minthresh.append((x, y))
for x, y in maxthresh:
try:
if (v[x - 1][1] < y) & (v[x + 1][1] < y):
peaks.append((x, y))
except Exception:
pass
for x, y in minthresh:
try:
if (v[x - 1][1] > y) & (v[x + 1][1] > y):
valleys.append((x, y))
except Exception:
pass
return peaks, valleys
</code></pre>
<p><strong>测试代码:</strong></p>
^{pr2}$
<p><a href="https://i.stack.imgur.com/NcYV5.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/NcYV5.png" alt="enter image description here"/></a></p>
<p><strong>额外测试,以确保在多个点超过阈值时检测到峰值:</strong></p>
<pre><code># input signal
t = array(range(100))
series = 6.3 * sin(t) + 4.7 * cos(2 * t) - 3.5 * sin(1.2 * t)
arr = [*zip(t, series)]
thresh = 0.95
peaks, valleys = peakdet(arr, thresh)
scatter([x for x, y in peaks], [y for x, y in peaks], color = 'red')
scatter([x for x, y in valleys], [y for x, y in valleys], color = 'blue')
plot(t, 100 * [thresh], color='green', linestyle='--', dashes=(5, 3))
plot(t, 100 * [-thresh], color='green', linestyle='--', dashes=(5, 3))
plot(t, series, 'k')
show()
</code></pre>
<p><a href="https://i.stack.imgur.com/wtrW2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wtrW2.png" alt="enter image description here"/></a></p>