首页 > 解决方案 > 使用 numpy 向量化从离散峰值或峰值中获取一系列步骤

问题描述

我有一个像这样的尖峰或峰的 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]

就像保持最近的峰值一样,即使低于前一个峰值。

标签: pythonnumpy

解决方案


推荐阅读