考虑以下名为final1 (信号)的numpy数组:

我想把前面的数组分成4个子数组。四个子数组在局部极小值之前的时刻被分隔开,如下面的图像所示:

我的想法是通过以下方法找到数组的局部最小值和最大值索引和值:
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个最大极小值,最后找到与四个最小值最接近的最大值,然后根据这些值的索引对final1数组进行拆分。
我想知道是否有人就如何完成最后一部分进行了讨论。
谢谢
编辑:这是信号矢量:https://app.box.com/s/isog7pa3xcradzcsivn5vtx7mj8u0wp1
发布于 2015-05-29 07:30:19
我不确定被接受的答案通常会像你在图表上显示的那样。我当然无法得到正确的答案!
一般情况下,你总是会得到交替的极大值和极小值,而边的情况没有一种或两者都有。您需要查看所有在它们前面有最大值的极小值,并且不需要搜索所有的最大值来查看哪个是最近的。而且,你的图上只有三个切点。
你有很多的“噪音”最大值和最小值,这可以很容易地扰乱你的结果-这将是一个好主意做一些平滑。此外,您使用论证的方式实际上与
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]编辑如果你看到附加的图片,你会发现你总是有交替的最大值和最小值-因为它们是什么。

您必须注意的情况是,第一个最小值在其左侧没有最大值。这就是我的行检查每个的第一个索引的方法。如果最大值不是第一次,它就从第一个最小值中剔除。它还必须确保maxima的列表被截断到与minima相同的长度。
我没查过的案子就像两条底线。如果没有足够的minima或maxima,您可以在这里停止这个过程:
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)]发布于 2015-05-28 15:32:50
您可以使用议论纷纷获取较小的最小值的索引:
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个最大值。
https://stackoverflow.com/questions/30489274
复制相似问题