我有一个像这样的尖峰或峰的Numpy数组:
peaks = [0, 0, 3, 0, 6, 0, 0, 9, 0, 0, 0, 0, 15, 0]
我想保持峰,以获取以下步骤:
steps = [0, 0, 3, 3, 6, 6, 6, 9, 9, 9, 9, 9, 15, 15]
我担心速度(这是对大型数组(1000 ** 3)的图像分析),因此我不能使用for循环或列表推导。确实必须对其进行矢量化处理。在for循环中,这显然是微不足道的,但是矢量化使我感到烦恼! (几乎是双关语)
此外,由于它将应用于2D和3D阵列/图像,因此仅适用于1D列表的解决方案是不够的。它只能在 1个轴上运行,但必须能够跨其他轴工作。我的意思是:
peaks = [[0, 0, 3, 0, 0, 6, 0, 0]
[0, 4, 0, 0, 8, 0, 0, 0]
[3, 0, 0, 0, 6, 0, 9, 0]]
应成为:
steps = [[0, 0, 3, 3, 3, 6, 6, 6]
[0, 4, 4, 4, 8, 8, 8, 8]
[3, 3, 3, 3, 6, 6, 9, 9]]
我觉得必须有一些numpy函数来执行此操作,但似乎找不到它。我希望有一个名为hold_peaks
的函数或类似的函数。
我一直在考虑cumsum
,它确实可以创建步骤,并且可以执行第一步,但是会使后续步骤变得过高。我也曾考虑过add.at
,但找不到创建索引的方法。
注释
在我计划的用例中,我希望峰值高度一直在增加,因此对我来说,可以做到这一点的解决方案:
peaks = [0, 4, 0, 0, 2, 0, 7, 0]
steps = [0, 4, 4, 4, 4, 4, 7, 7]
但是我想最好这样做:
peaks = [0, 4, 0, 0, 2, 0, 7, 0]
steps = [0, 4, 4, 4, 2, 2, 7, 7]
保持最近的峰值,即使该峰值低于前一个峰值。