首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy中局部极小值前的分裂信号

Numpy中局部极小值前的分裂信号
EN

Stack Overflow用户
提问于 2015-05-27 17:25:29
回答 2查看 369关注 0票数 1

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

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

我的想法是通过以下方法找到数组的局部最小值和最大值索引和值:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-29 07:30:19

我不确定被接受的答案通常会像你在图表上显示的那样。我当然无法得到正确的答案!

一般情况下,你总是会得到交替的极大值和极小值,而边的情况没有一种或两者都有。您需要查看所有在它们前面有最大值的极小值,并且不需要搜索所有的最大值来查看哪个是最近的。而且,你的图上只有三个切点。

你有很多的“噪音”最大值和最小值,这可以很容易地扰乱你的结果-这将是一个好主意做一些平滑。此外,您使用论证的方式实际上与

代码语言:javascript
复制
np.where((a[:-2] > a[1:-1]) & (a[1:-1] < a[2:]))

(这可能会更快,但您必须+1到索引值),两者都会错过一个转折点,恰好有两个相同的值。

不管怎么说,你的数据似乎适用于我:

代码语言:javascript
复制
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,您可以在这里停止这个过程:

代码语言:javascript
复制
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)]
票数 2
EN

Stack Overflow用户

发布于 2015-05-28 15:32:50

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

代码语言:javascript
复制
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个最大值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30489274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档