Python 3.x Numpy怎么办。。。峰值查找“;“承诺”;numpy语法中的计算

Python 3.x Numpy怎么办。。。峰值查找“;“承诺”;numpy语法中的计算,python-3.x,numpy,scipy,Python 3.x,Numpy,Scipy,对于numpy用户来说有点陌生,试图看到一个“如何在numpy中使用”的解决方案来解决numpy语法中的算法问题 我希望在这里寻求一些帮助是可以的,因为我被难倒了,希望得到一些建议-我希望这不是TLDR'ish 背景: 我正在尝试手动计算“突出度”以从峰值查找中删除峰值,并尝试查看是否有一种简单的“numpy”方法来实现这一点,而不是循环 在任何人说之前,我知道可以用指定的突出度删除峰值,但我一直在想如何手动使用numpy语法,而不是循环索引(我知道C,我正在尝试学习numpy…): 原因:

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

我希望在这里寻求一些帮助是可以的,因为我被难倒了,希望得到一些建议-我希望这不是TLDR'ish

背景

我正在尝试手动计算“突出度”以从峰值查找中删除峰值,并尝试查看是否有一种简单的“numpy”方法来实现这一点,而不是循环

在任何人说之前,我知道可以用指定的突出度删除峰值,但我一直在想如何手动使用numpy语法,而不是循环索引(我知道C,我正在尝试学习numpy…):


原因

原因是我需要将现有的scipy逻辑从更改为“如果峰值左侧或右侧的突出度正常(即足够大),则峰值应保持“”,如果左侧或右侧的突出度太小,则删除峰值“

这相当于将
max(left\u min,right\u min)
编码更改为
min(left\u min,right\u min)


用于数组上的前/后循环-我试图了解这是否可能是numpy符号/语法(不用于循环),但经过一天的努力,我想不出如何做到这一点-因此我希望得到一些numpy建议


概念逻辑很简单: 在剖面图(1d阵列)中找到峰值,然后计算左/右相邻山谷上每个峰值的高度(即“突出度”),然后删除左或右高度小于某个阈值的峰值-即两侧的峰值不够“峰值”


在上面的例子中,我想删除两个中心峰,因为两个中心峰在中央“山谷”上的高度(突出)太小-即使周围两个外部山谷的高度可以


那么,我的numpy帮助问题

我知道如果我有一个
peaks
数组索引到
profile
数组中,我可以使用np.delete删除“不够峰值”,如果我可以为每个峰值计算数组的左/右高度集:

np.delete(peaks, np.where( (left_height<10) | (right_height<10) )[0])
我不知道的是如何计算左高和右高数组。类似

left_height = profile[peaks] - profile[peaks[-1]:peaks].min()
这基本上是“使用峰值数组,使用当前和以前的位置,生成一个切片,然后使用该切片获得轮廓值,然后计算这些轮廓值的最小值”的逻辑


这种逻辑是否可以只使用python-istic-numpy实现,还是需要一个循环手册?

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

第一个版本的
peak\u-eprogences
实际上是作为一个纯Python实现添加的,您可以找到它

该实现仍然会在每个峰值上循环一次,明显比Cython实现慢,但可能仍然是您所要寻找的。您基本上希望更改在上计算轮廓高度的方式,就像您自己建议的那样

我搞不懂的是如何计算left_height和right_height数组

left_height = profile[peaks] - profile[peaks[-1]:peaks].min()
left\u height=profile[peaks]-profile[peaks[-1]:peaks].min()

在计算左右高度时,您似乎已经非常接近解决方案(忽略前面与窗口相关的内容)。下面是使用变量名查找单个
峰值的左右高度的关键点:

# 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
#剖面大于当前峰值高度的位置
更大的峰值=np。其中(剖面>剖面[峰值])[0]
尝试:
#最靠近峰值左侧的位置
#配置文件[左]>配置文件[峰值]
左=更大的峰值[更大的峰值<峰值]。最大值()
除值错误外:
左=0
尝试:
#最靠近峰值右侧的位置
#配置文件[右]>配置文件[峰值]
右=更大峰值[更大峰值>峰值].min()
除值错误外:
右=无
#剖面图中峰值左侧和右侧的基准指数
left_height=外形[左:峰值].argmin()+左
右侧高度=外形[峰值:右侧].argmin()+峰值
我希望这对你的努力有所帮助


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

嘿,谢谢你的快速回复!…很高兴听到你的回复,因为你是原始作者!我很高兴即使你在标记上有一个外部for循环,我也这样做了-我试图弄清楚是否有可能做到让我难堪的纯python-numpy'ish!我将使用一个类似的应用程序roach在for loopYes中手动获取切片-在第403行中,我基本上是在寻找一个最小而不是最大的逻辑(即“最高的_轮廓”)……我将用两行代码来装饰现有的scipy代码,以完成相同的事情,并很好地运行。再次感谢!