<p><a href="https://stackoverflow.com/a/48024165/4999991">The solution offered by fuglede</a>很好,但是如果您的数据非常嘈杂(如图中所示),您将最终得到许多误导性的本地外部数据。我建议您使用<code>scipy.signal.argrelextrema</code>函数。<code>argrelextrema</code>有其自身的局限性,但它有一个很酷的特性,可以指定要比较的点数,有点像噪声过滤算法。例如:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.signal import argrelextrema
# Generate a noisy AR(1) sample
np.random.seed(0)
rs = np.random.randn(200)
xs = [0]
for r in rs:
xs.append(xs[-1]*0.9 + r)
df = pd.DataFrame(xs, columns=['data'])
n=5 # number of points to be checked before and after
# Find local peaks
df['min'] = df.iloc[argrelextrema(df.data.values, np.less_equal, order=n)[0]]['data']
df['max'] = df.iloc[argrelextrema(df.data.values, np.greater_equal, order=n)[0]]['data']
# Plot results
plt.scatter(df.index, df['min'], c='r')
plt.scatter(df.index, df['max'], c='g')
plt.plot(df.index, df['data'])
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/RXqNd.png" rel="noreferrer"><img src="https://i.stack.imgur.com/RXqNd.png" alt="enter image description here"/></a></p>
<p>一些要点:</p>
<ul>
<li>你可能需要检查之后的点,以确保没有点非常接近对方。</li>
<li>你可以用<code>n</code>来过滤噪声点</li>
<li><code>argrelextrema</code>返回元组,末尾的<code>[0]</code>提取<code>numpy</code>数组</li>
</ul>