python - 使用 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]
就像保持最近的峰值一样,即使低于前一个峰值。
解决方案
推荐阅读
- go - 用于服务间通信的基于 gRPC 的微服务架构
- javascript - 将函数 prop 传递给子组件(通过 Link 和 Route 组件)
- xamarin.forms - 如何在 Xamarin iOS 和 Android 在管道中构建任务之前替换 json 配置值
- python - 将二维向量多次添加到另一个二维向量的有效方法
- angular - 已选择 Angular 自动完成输入并模糊事件竞争条件
- python - 如何将 Meteor 链接到 Opencv python
- mysql - 从 SQL 中的短日期格式中提取数字日期值
- javascript - 使用具有可变字段的数据解析 JSON
- python - 在 iOS/Pythonista 上运行 Scrapy?
- javascript - 如何在javascript中的if else语句中检查parentNode classList