【问题标题】:How to sort an array and find the two highest peaks after using find_peaks from Scipy使用 Scipy 的 find_peaks 后如何对数组进行排序并找到两个最高峰
【发布时间】:2019-03-14 11:48:11
【问题描述】:

我有点挣扎 find_peaks...

我将三次样条应用于一些数据,我想从中提取一些峰值。但是,数据可能有几个峰值,而我只想要两个最大的。我可以找到山峰

peak_data = signal.find_peaks(spline, height=0.3, distance=50)

我可以使用它来获取 peak_data 内索引点的 x 和 y 值

peak_vals = spline[peak_data[0]]
time_vals = xnew[peak_data[0]] # xnew being thee splined x-axis

我想我可以订购peak_vals 并保留前两个值(即最高和第二高峰),然后使用它从xnew 中获取与这些值一致的时间。但是,我无法使用返回的.sort

AttributeError: 'tuple' object has no attribute 'sort'

或返回的sorted()

TypeError: '>' not supported between instances of 'int' and 'dict'

我认为这是因为它是从 Numpy 数组(样条数据)中索引的,因此会创建另一个 numpy 数组,然后该数组中的任何一个排序命令都不起作用。

我能做到的最好的办法是遍历一个新列表,然后从中获取前两个值:

peak_val1=[]

peak_vals = spline[peak_data[0]]
    for i in peak_val_d:
        peak_val1.append(i)
peak_val1.sort(reverse=True)
peak_val2 = peak_val1[0:2]

这可行,但考虑到我仍然需要索引时间值,这似乎是一种非常冗长的方法。我确定一定有更快(更简单)的方法?

补充说明:我意识到 find_peaks 返回一个索引列表,但它实际上似乎包含索引和最大值和数组字典? (对不起,我对python很陌生,花括号意味着字典,但它看起来不像一个简单的字典)。无论如何...print(peak_data) 返回索引位置及其值。

(array([ 40, 145, 240, 446]), {'peak_heights': array([0.34588031, 0.43761898, 0.45778744, 0.74167977])})

有没有办法直接访问这些数据?

【问题讨论】:

    标签: arrays python-3.x numpy scipy


    【解决方案1】:

    只是发布这个以防其他人有类似的问题,并提醒自己以后仔细阅读文档!

    假设没有其他参数,find_peaks() 返回一个包含峰值索引的元组和数组,以及一个实际峰值的字典。一旦我意识到这一点,执行序列解包以生成单独的数组和字典就非常简单了。所以如果我从

    peak_data = signal.find_peaks(spline, height=0.3, distance=50)
    

    我需要做的就是解压成两个变量

    peak_index, dict_vals = peak_data
    

    现在我按照它们被识别的顺序获得了索引和值。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      peak_indices, peak_dict = signal.find_peaks(spline, height=0.3, distance=50)
      

      这将返回数组中所有峰的索引,以及有关峰的信息字典,例如它们的高度、突出度等。要获取峰的高度,您可以像这样访问字典:

      peak_heights = peak_dict['peak_heights']
      

      然后找到最高和第二高峰的索引,您可以这样做:

      highest_peak_index = peak_indices[np.argmax(peak_heights)]
      second_highest_peak_index = peak_indices[np.argpartition(peak_heights,-2)[-2]]
      

      希望这对某个地方的人有所帮助:))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2021-03-26
        • 2020-11-21
        • 2023-03-18
        • 2018-08-11
        相关资源
        最近更新 更多