计算Python中的直方图峰

bri*_*ian 6 python

在Python中,如何计算直方图的峰值?

我尝试了这个:

import numpy as np
from scipy.signal import argrelextrema

data = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 1, 2, 3, 4,

        5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9,

        12,

        15, 16, 17, 18, 19, 15, 16, 17, 18, 

        19, 20, 21, 22, 23, 24,]

h = np.histogram(data, bins=[0, 5, 10, 15, 20, 25])
hData = h[0]
peaks = argrelextrema(hData, np.greater)
Run Code Online (Sandbox Code Playgroud)

但是结果是:

(array([3]),)
Run Code Online (Sandbox Code Playgroud)

我希望它能找到bin 0和bin 3中的峰值。

请注意,峰跨度超过1 bin。我不希望将跨越1列以上的峰视为其他峰。

我愿意采用另一种方法达到顶峰。

注意:

>>> h[0]
array([19, 15,  1, 10,  5])
>>> 
Run Code Online (Sandbox Code Playgroud)

S. *_*ber 6

在计算拓扑中,持久同源性的形式提供了“峰值”的定义,似乎可以满足您的需求。在一维情况下,峰值由下图中的蓝条表示:

最持久的峰值

该算法的描述在峰值检测问题的堆栈溢出答案中给出 。

好消息是这种方法不仅可以识别峰值,而且可以以自然的方式量化“重要性”。

一个简单有效的实现(与排序数字一样快)以及本博客文章中给出的上述答案的源材料:https : //www.sthu.org/blog/13-perstopology-peakdetection/index.html


erd*_*ant 5

尝试一下findpeaks图书馆。

pip install findpeaks

# Your input data:
data = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 15, 16, 17, 18,  19, 20, 21, 22, 23, 24,]

# import library
from findpeaks import findpeaks

# Find some peaks using the smoothing parameter.
fp = findpeaks(lookahead=1, interpolate=10)
# fit
results = fp.fit(data)
# Make plot
fp.plot()
Run Code Online (Sandbox Code Playgroud)

输入数据

# Results with respect to original input data.
results['df']

# Results based on interpolated smoothed data.
results['df_interp']
Run Code Online (Sandbox Code Playgroud)


小智 2

我写了一个简单的函数:

def find_peaks(a):
  x = np.array(a)
  max = np.max(x)
  length = len(a)
  ret = []
  for i in range(length):
      ispeak = True
      if i-1 > 0:
          ispeak &= (x[i] > 1.8 * x[i-1])
      if i+1 < length:
          ispeak &= (x[i] > 1.8 * x[i+1])
    
      ispeak &= (x[i] > 0.05 * max)
      if ispeak:
          ret.append(i)
  return ret
Run Code Online (Sandbox Code Playgroud)

我将峰值定义为大于邻居峰值的 180% 且大于最大值的 5% 的值。当然,您可以根据自己的喜好调整这些值,以便找到最适合您问题的设置。