2015-05-27 35 views
1
局部最小值前右

考虑命名final1(信号)以下numpy的数组: enter image description here分离信号在numpy的

我想前面的阵列分成4个个子阵列。四个子阵列由瞬间的局部极小前右侧分隔,如图所示如下图: enter image description here

的想法我是找到阵列的本地最小值和最大值的索引和值:

minimaindex = argrelextrema(final1, np.less) 
maximaindex = argrelextrema(final1, np.greater) 
valuesminima = final1[argrelextrema(final1, np.greater)[0]] 
valuesmaxima = final1[argrelextrema(final1, np.less)[0]] 

然后根据值数组对索引数组进行排序,考虑4个最大最小值,最后找到最接近4个最小值的最大值,并将这些值的索引拆分为final1

我想知道是否有人有关于如何完成最后一部分的推理。

谢谢

编辑: 这是信号矢量: https://app.box.com/s/isog7pa3xcradzcsivn5vtx7mj8u0wp1

+0

的主要问题是区分四个极小你有兴趣从十一二岁那是你的阴谋。可能最好的办法是查看最大和最小分钟之间的差异,并采取这四个最大的那些 – paddyg

+0

是的,这个想法是找到所有的最大值和最小值。获得4个最小最小值,并计算4个最小值中的每一个到所有最大值的距离,每个最小值的最小距离是我寻找每个最小值的最大值。我的问题是关于如何对值向量和索引向量执行操作。如何优化排序一个向量并影响其他向量? – user3025898

回答

1

我不确定接受的答案通常会做你在图表上显示的内容。我当然无法让它产生正确的答案!

通常情况下,您总会得到交替的最大值和最小值以及一个或两个都不存在的边缘情况。你需要查看所有最大值最小的最小值,并且不需要搜索所有最大值来查看哪个最大值。你的图表上只有三个切点。

你有很多“噪音”最大值和最小值可能很容易混淆你的结果 - 这将是一个好主意做一些平滑。另外你使用argrelextrema的方法是有效的一样

np.where((a[:-2] > a[1:-1]) & (a[1:-1] < a[2:])) 

(这可能是速度快,但你必须+1到索引值)都将错过刚巧有两个值相同的一个转折点。

反正这似乎是我与您的数据进行工作:

import numpy as np 
from scipy import signal 

final1 = np.loadtxt("/home/jill/Downloads/256frames_timed_SumrowSignal_1.csv", delimiter=",") 
#final1 = np.convolve(final1, [0.1, 0.2, 0.4, 0.2, 0.1]) 

minimaindex = signal.argrelextrema(final1, np.less)[0] 
maximaindex = signal.argrelextrema(final1, np.greater)[0] 

if minimaindex[0] < maximaindex[0]: # ensure all minima have a previous maxima 
    minimaindex = minimaindex[1:] 
maximaindex = maximaindex[:len(minimaindex)] 
diffs = final1[maximaindex] - final1[minimaindex] 
diffs_as = np.argsort(diffs)[-3:] 
cut_points = maximaindex[diffs_as] 

编辑如果你看一下附加的图片,你会看到,你总是必须有交替的最大值和最小值 - 因为他们是什么。

enter image description here

你看出来的情况是,其中第一最小没有最大点在它的左边。这就是我检查每一个索引的行。如果最大值不是第一个,它会删除第一个最小值。它还必须确保最大值列表被截断为与最小值相同的长度。

我不检查的情况就像下面两行。你可以只停在这里的过程中,如果没有足够的最低或最高:

if minimaindex[0] < maximaindex[0]: # ensure all minima have a previous maxima 
    minimaindex = minimaindex[1:] 
if len(minimaindex) < 3 or len(maximaindex) < 3: 
    error_message = "not enough peaks" 
    return None #break, exit, whatever is relevant to the way you use the code 
maximaindex = maximaindex[:len(minimaindex)] 
+0

是的,的确,以前的答案并不能解决问题,但它非常有帮助。你的问题是你如何确定'diffs = final1 [maximaindex] - final1 [minimaindex]'计算局部最小值的先前最大值之间的差异,如果你有一个未知数目的最大值和最低?我希望你的代码可以推广到我拥有的其他类似信号 – user3025898

1

您可以使用argsort获得较小的最低高度的指标:

valuesminima = final1[minimaindex] 
# Find 4 smaller minimas 
idx = np.argsort(valuesminima) # sort minima 
target = idx[:4] # 4 smaller minimas 

# Find all maximas 
argmaximas = argrelextrema(final1, np.less) 

# Extract maximas closest to the minimas 
maximas = [] 
for minidx in minimaindex[target]: # for each minima 
    dist = np.abs(argmaximas - minidx) # distance current minima 
    maximas += [np.argmin(dist)] # get the closest maxima 

花哨也不过分,但我猜猜它可以工作。 maximas包含最接近较小4个最小值的4个最大值。

+0

嗨我有一个索引向量和最小值和最大值的值向量。我想用maxima和minima的值作为排序来执行操作,而且这个操作也必须改变索引。我认为它应该类似于您发布的代码 – user3025898

+0

@ user3025898我已更新答案。它找到了前4个最小值,所有最大值。然后它找到每个最小值最接近的最大值。 –

+0

谢谢,我只是运行你的代码,似乎在循环中,你正在减去最小值的索引(最大值的值)(argmaximas),那是正确的吗? – user3025898