【问题标题】:How to find all the peaks in a given 1D array?如何找到给定一维数组中的所有峰值?
【发布时间】:2021-07-22 12:46:09
【问题描述】:

我想找到像这样生成的给定一维数组的所有峰值点: vertical_projection = np.sum(projCopy, axis=0)(此数组包含二值图像每列黑色像素的总和。) 当我打印这个数组时,我得到了,

    [1213 1335 1335 1335 1335 1335 1335 1335 1335 1335 1335 1335 1335 1335
     960    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0  957  958  958  958  959  960  974 1072 1073
     1072 1007 1008 1007  998  998  997  996  996  996  995  907  741  706
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0    0    0    0  755 1331 1332]
 

所以我想打印峰值点的所有数组索引,而不提供任何阈值来计算峰值点。

【问题讨论】:

  • 该数组的预期输出是什么?
  • @DanielF 它应该是值 1335(来自第一组非零值)、1073(来自第二组非零值)、1332(来自最后一组 755,1331)的数组索引,1332)
  • 您提到了非零值。你的意思是你只考虑每段非零值的一个“峰值”吗?
  • @YvesDaoust 是的
  • 如果出现平局,你应该返回什么?

标签: python arrays numpy image-processing


【解决方案1】:
  1. 分隔数组非零的切片。

  2. 在每个切片中,找到最大值。

  3. 在每个切片中,划定达到最大值的子切片。

  4. 现在返回每个子切片的中间。

1 和 2 可以在对数组的单次遍历中进行,而 3 和 4 需要在每个切片中进行第二次局部遍历。

【讨论】:

    【解决方案2】:

    您可以使用numpy.argwhere 然后numpy.flatten 来接收所需的结果,如下例所示:

    import numpy as np
    
    rr = np.array([1213, 1335, 1335, 1335, 1335, 1335, 1335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1008, 1007, 998, 998, 997, 996, 996, 996])
    th = 1200
    np.argwhere(arr==arr.max()).flatten()
    

    输出:

    array([1, 2, 3, 4, 5, 6])
    

    干杯。

    【讨论】:

    • 我正在寻找一种无需提供任何阈值的方法。顺便说一句,感谢您的回答
    • 好的,我已经为此目的编辑了答案。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多