我不确定接受的答案通常会做你在图表上显示的内容。我当然无法让它产生正确的答案!
通常情况下,您总会得到交替的最大值和最小值以及一个或两个都不存在的边缘情况。你需要查看所有最大值最小的最小值,并且不需要搜索所有最大值来查看哪个最大值。你的图表上只有三个切点。
你有很多“噪音”最大值和最小值可能很容易混淆你的结果 - 这将是一个好主意做一些平滑。另外你使用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]
编辑如果你看一下附加的图片,你会看到,你总是必须有交替的最大值和最小值 - 因为他们是什么。
你看出来的情况是,其中第一最小没有最大点在它的左边。这就是我检查每一个索引的行。如果最大值不是第一个,它会删除第一个最小值。它还必须确保最大值列表被截断为与最小值相同的长度。
我不检查的情况就像下面两行。你可以只停在这里的过程中,如果没有足够的最低或最高:
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)]
的主要问题是区分四个极小你有兴趣从十一二岁那是你的阴谋。可能最好的办法是查看最大和最小分钟之间的差异,并采取这四个最大的那些 – paddyg
是的,这个想法是找到所有的最大值和最小值。获得4个最小最小值,并计算4个最小值中的每一个到所有最大值的距离,每个最小值的最小距离是我寻找每个最小值的最大值。我的问题是关于如何对值向量和索引向量执行操作。如何优化排序一个向量并影响其他向量? – user3025898