在Numpy中的局部极小值之前拆分信号

在Numpy中的局部极小值之前拆分信号,numpy,split,Numpy,Split,考虑以下名为final1(信号)的numpy数组: 我想将前面的数组分为4个子数组。如下图所示,四个子阵列在局部极小值之前的瞬间被分开: 我的想法是找到数组的局部极小值和极大值索引和值,包括: minimaindex = argrelextrema(final1, np.less) maximaindex = argrelextrema(final1, np.greater) valuesminima = final1[argrelextrema(final1, np.greater)[0]

考虑以下名为
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个最大值,最后找到与四个最小值最接近的最大值,并通过这些值的索引将<代码> Fial1数组拆分。 我想知道是否有人对如何完成最后一部分有建议

多谢各位

编辑: 这是信号向量:

您可以使用获取较小最小值的索引:

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

不太花哨,但我想它可以用<代码>最大值包含最接近较小的4个最小值的4个最大值。

我不确定接受的答案通常会符合您在图表上显示的结果。我当然不能让它给出正确的答案

通常情况下,当边缘情况不是一个或两个都不是时,你总是会得到交替的最大值和最小值。您需要查看所有在它们之前有一个最大值的最小值,而不需要搜索所有的最大值来查看哪个最近。此外,图形上只有三个切点

你有很多“噪音”的最大值和最小值,这很容易扰乱你的结果-这将是一个好主意做一些平滑。另外,使用argrelextrema的方法实际上与

np.where((a[:-2] > a[1:-1]) & (a[1:-1] < a[2:]))
np.where((a[:-2]>a[1:-1])&(a[1:-1]
(这可能会更快,但必须+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]
将numpy导入为np
从scipy输入信号
final1=np.loadtxt(“/home/jill/Downloads/256frames\u timed\u SumrowSignal\u 1.csv”,分隔符=“,”)
#final1=np.卷积(final1[0.1,0.2,0.4,0.2,0.1])
最小索引=signal.argrelextrema(final1,np.less)[0]
maximaindex=signal.argrelextrema(final1,np.more)[0]
如果最小索引[0]<最大索引[0]:#确保所有最小值都有以前的最大值
最小索引=最小索引[1:]
maximaindex=maximaindex[:len(minimandex)]
差异=最终1[最大索引]-最终1[最小索引]
diffs_as=np.argsort(diffs)[-3:]
切点=最大索引[差异]
编辑如果你看附件的图片,你会发现你总是有交替的最大值和最小值-因为它们是什么

您必须注意的情况是,第一个最小值的左侧没有最大点。这就是我的行检查每个行的第一个索引所做的。如果最大值不是第一个,它将删除第一个最小值。它还必须确保最大值列表被截断为与最小值相同的长度

我没有检查的案例就像最后两行一样。如果没有足够的最小值或最大值,您可以在此处停止此过程:

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]
主要问题是区分您感兴趣的四个最小值与绘图中的十一或十二个最小值。也许最好的方法是看一个最大值和下一个最小值之间的差异,然后取四个最大的thoseYes,这个想法是找到所有的最大值和最小值。获取4个最小值,并计算4个最小值中的每一个到所有最大值的距离,而到每个最小值的最小距离就是我正在寻找的每个最小值的最大值。我的问题是如何对值向量和索引向量执行操作。如何优化一个向量的排序并影响另一个?嗨,我有一个索引向量和一个最小值和最大值的值向量。我想用最大值和最小值作为排序来执行操作,这个操作还必须更改索引。我认为它应该与您使用的代码类似posted@user3025898我已经更新了答案。它找到了前4个最小值,所有的最大值。然后它会为每个最小值找到最接近的最大值。谢谢,我刚刚运行了您的代码,在循环中,您似乎正在将最小值的索引减去最大值的值(argmaximas),对吗?出于某种原因,返回的最大值列表为空,我认为应该是maximas.append()而不是maximas+=@user3025898
maximas+=[\uz]
具有与
append
相同的结果。如果您仍然有一个空列表,可能是您没有正确地检测到最小值,或者没有按原样复制代码。在任何情况下,这只会在您正确检测到最小值和最大值的情况下起作用。正如@paddyg所指出的,这不是一项容易的任务,类似于
argrelextrema
(我在你的问题中使用了它)的东西将无法正常工作。你需要的不仅仅是极值的值。你至少需要一些中心、向前或向后的差异来估计最小值有多小。是的,事实上,前面的答案并不能解决这个问题,但它非常有用。您获得了3个所需的截止点,我的问题是,如果您有未知数量的最大值和最小值,您如何确定
diff=final1[maximaindex]-final1[minimandex]
计算局部最小值之前最大值之间的差值?我希望您的代码可以推广到其他类似的信号,我有