首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何?...Peak在Numpy语法中查找“突出”计算

如何?...Peak在Numpy语法中查找“突出”计算
EN

Stack Overflow用户
提问于 2019-09-06 23:34:44
回答 1查看 535关注 0票数 1

对于numpy用户来说有点陌生,试图看到“如何在numpy中”解决算法中的numpy语法问题。

我希望在这里寻求一些帮助是可以的,因为我被困住了,我会喜欢一些建议-我希望这不是TLDR‘isn!

背景

我正在尝试手工计算“显着性”以从峰值发现中删除峰值,并试图查看是否有一种简单的"numpy“方法来实现这一点,而不是循环。

在任何人说之前,我知道https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html可以移除具有指定突出位置的峰值,但我试图弄清楚如何使用numpy语法手动删除峰值,而不是循环索引(我知道C,我正在尝试学习numpy.):

原因

原因是我需要从中改变现有的枕逻辑,“如果一个峰值的左边或右侧的日珥没有问题(即足够大),那么如果左或右日珥太小,则峰值应该保持为” to “,然后删除峰值”“。

这相当于将枕码第252行上的枕码第252行代码更改为min(left_min, right_min)

查找突出值的代码在数组上使用循环()--我正在尝试学习它是否可能以numpy表示法/语法(不用于循环),但经过一天的努力,无法弄清楚如何做到这一点--所以我很喜欢一些numpy建议!

概念逻辑很简单:在配置文件(一维数组)中找到峰值,然后计算左右相邻山谷(即“日珥”)上每个峰的高度,然后删除左或右高度小于某一阈值的峰值--即两边都不够“轻微”。

在上面的例子中,我想移除两个中心峰,因为两者在中央“山谷”上方的高度(日珥)太小了--尽管周围的两个山谷外的高度可以。

所以,我的矮小的帮手质疑

我知道,如果我有一个peaks数组是profile数组的索引,我可以使用np.delete来删除“不够峰值”,如果我可以计算每个峰值的left_height和right_height数组集:

代码语言:javascript
运行
复制
np.delete(peaks, np.where( (left_height<10) | (right_height<10) )[0])

对于峰值数组中的特定值,我可以通过在峰值索引之间切片和在片中找到min配置文件值来找到它们之间的“山谷”:

代码语言:javascript
运行
复制
profile[peaks[0]:peaks[1]].min()

我想不出的是如何计算left_height和right_height数组。

代码语言:javascript
运行
复制
left_height = profile[peaks] - profile[peaks[-1]:peaks].min()

这本质上是“使用带有当前和先前位置的峰值数组来生成一个切片,然后使用该切片获取概要值,然后计算这些配置文件值的最小值”的逻辑。

这种逻辑可能只使用python特性的numpy,还是需要一个循环手册?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-07 00:05:00

这是一个很好的学习方法!:)

peak_prominences的第一个版本实际上是作为一个纯Python实现添加的,您可以找到这里

该实现仍然在每个峰值上循环一次,并且显然比Cython实现慢,但可能仍然是您所要寻找的。您本质上想要改变轮廓高度是如何计算在第403和404行上,正如您已经建议自己。

我想不出的是,如何计算left_height和right_height数组。有点像 left_height = profile[peaks] - profile[peaks[-1]:peaks].min()

您似乎已经非常接近在第382至400项中计算左、右高度的解决方案(忽略前面与窗口相关的内容)。下面是使用变量名查找单个peak左、右高度的关键部分:

代码语言:javascript
运行
复制
# Positions where profile is larger than current peak height
greater_peak = np.where(profile > profile[peak])[0]

try:
    # Nearest position to the left of peak with
    # profile[left] > profile[peak]
    left = greater_peak[greater_peak < peak].max()
except ValueError:
    left = 0
try:
    # Nearest position to right of peak with
    # profile[right] > profile[peak]
    right = greater_peak[greater_peak > peak].min()
except ValueError:
    right = None

# Base indices to the left and right of peak in profile
left_height = profile[left:peak].argmin() + left
right_height = profile[peak:right].argmin() + peak

我希望这对你的努力有帮助。

免责声明:我是那个函数的作者。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57829549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档