如何在一维数组中找到峰值

5
我正在使用Python读取CSV文件并准备数据框。我有一个记录Arm Abduction运动并生成此CSV文件的Microsoft Kinect。
我有一个ElbowLeft关节Y坐标的数组。您可以在此处可视化它。现在,我想提出一个解决方案,可以计算该数组中峰值或局部最大值的数量。
请问有人可以帮我解决这个问题吗?

尝试使用scipy.signal.find_peaks_cwt - DYZ
2
较新的 scipy.signal.find_peaks 可能效果更好,除非您确实需要使用小波卷积。 - onewhaleid
这个回答解决了你的问题吗?在1D numpy数组中使用Numpy查找局部最大值/最小值 - Christoph Rackwitz
3个回答

5
您可以使用 scipy.signal 模块的 find_peaks_cwt 函数在 1-D 数组中查找峰值:
from scipy import signal
import numpy as np

y_coordinates = np.array(y_coordinates) # convert your 1-D array to a numpy array if it's not, otherwise omit this line
peak_widths = np.arange(1, max_peak_width)
peak_indices = signal.find_peaks_cwt(y_coordinates, peak_widths)
peak_count = len(peak_indices) # the number of peaks in the array

详见此处:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html


2

很简单,把数据放入一个一维数组中,并将每个值与相邻的值进行比较,n-1和n+1的数据小于n。

像Robert Valencia建议的那样读取数据。

   max_local=0
for u in range (1,len(data)-1):

if ((data[u]>data[u-1])&(data[u]>data[u+1])):
                            max_local=max_local+1

1
这个算法对于像 data = [3,2,3,6,4,1,2,3,2,1,2,2,2,1] 这样的输入会失败。 - Waleed Baig

1
您可以尝试使用平滑滤波器来平滑数据,然后找到所有前后值都小于当前值的值。这假设您想要序列中的所有峰值。需要平滑滤波器的原因是避免局部极大值。所需的平滑程度取决于数据中的噪声水平。
一个简单的平滑滤波器将当前值设置为分析的当前值以及序列中当前值之前和之后的N个值的平均值。

我使用了移动平均平滑法来平滑它(使用np.convolve)。并且使用了scipy.signal中的argrelextrema。 - Pranav Masariya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接