Python 使用scipy.signal.argrelextrema同时查找局部极小值和极大值

Python 使用scipy.signal.argrelextrema同时查找局部极小值和极大值,python,numpy,scipy,Python,Numpy,Scipy,我想在一个数组中同时找到局部极小值和极大值。我试图使用Scipy的argrelextrema,但没有找到任何关于所需比较器函数的文档。我试图写我自己的,但没有成功。我怎么能这样做 我想这样做,但只调用一次argrelextrema,而不是使用argrelmin和argrelmax对数据进行两次迭代,因为我的数据非常长,我必须使用它多次执行此操作: import numpy as np import scipy.signal as sg data = [[xes], [ys]]

我想在一个数组中同时找到局部极小值和极大值。我试图使用Scipy的argrelextrema,但没有找到任何关于所需比较器函数的文档。我试图写我自己的,但没有成功。我怎么能这样做

我想这样做,但只调用一次
argrelextrema
,而不是使用
argrelmin
argrelmax
对数据进行两次迭代,因为我的数据非常长,我必须使用它多次执行此操作:

   import numpy as np
   import scipy.signal as sg

   data = [[xes], [ys]]   #a long 2d array
   max_places = np.array(sg.argrelmax(data[1]))[0] 
   min_places = np.array(sg.argrelmin(data[1]))[0]
   extrema_places = np.contantenate((max_places, min_places))

你的目标毫无意义

使用文档中的示例:

In [199]: from scipy.signal import argrelextrema
In [200]:  x = np.array([2, 1, 2, 3, 2, 0, 1, 0])
In [201]: argrelextrema(x, np.greater)
Out[201]: (array([3, 6], dtype=int32),)
这得到了局部极大值。更改为
less
以获得局部最小值

In [202]: argrelextrema(x, np.less)
Out[202]: (array([1, 5], dtype=int32),)
一个
lambda
函数可以代替
np工作。更大的

In [204]: argrelextrema(x, lambda a,b: a>b)
Out[204]: (array([3, 6], dtype=int32),)
我们可以用or组合>和<,但这只会获取所有点(除了端点)

但是假设你能给它想要的功能,你想要什么样的结果?最大值和最小值串在一起作为一个数组,或者作为两个数组,或者作为二维数组

np.array([1,3,5,6])
(np.array([3,6]), np.array([1,5]))
刚刚意识到结果已经是一个元组,如
where
,每个维度一个数组。事实上,这就是它的回报:

results = _boolrelextrema(data, comparator,
                          axis, order, mode)
return np.where(results)
任务的核心是
\u boolrelextrama
函数;它可能返回一个类似于
data
的数组,但基于
比较器
返回True/False

你是否在寻找一个转折点,在任何一个方向?您可能想玩
命令

In [217]: argrelextrema(x, lambda a,b: (a>b) | (a<b), order=2)
Out[217]: (array([1, 3, 6], dtype=int32),)
argrelmin
生成相同的
,但随后会:

In [270]: np.where((x<plus) & (x<minus))
Out[270]: (array([1, 5], dtype=int32),)
组合的
min\u max
可以保存2个
take
操作,但在其他情况下,它必须执行相同的2个比较器步骤


请注意,所有这些操作都是在编译代码中进行的;数据数组上没有Python级别的迭代。

我想你误解了我的目标。它不是找到所有不等于任何相邻点的点,而是在单个数组中获得最小值和最大值的索引,而不需要对数据进行两次迭代。我添加了一个更好的例子,原来的可能有误导性。
argrelmax
只是
argrelextrema(数据,np.greater,axis,order,mode)
。我演示了这一点,但没有将两个数组连接成一个数组。。。请写清楚。。你想解释什么?@shantanupathak,如果你在某个问题上需要帮助,问你自己的问题。不要试图增加一个旧的答案(其他人认为已经足够了)。有一些较新的问题涉及到
argrelextrema
In [217]: argrelextrema(x, lambda a,b: (a>b) | (a<b), order=2)
Out[217]: (array([1, 3, 6], dtype=int32),)
In [262]: x = np.array([2, 1, 2, 3, 2, 0, 1, 0])   # data
In [263]: locs = np.arange(0,len(x))          # all indices
In [264]: plus=np.take(x,locs+1,mode='clip')   # shift up, with 'clip'
In [265]: minus=np.take(x,locs-1,mode='clip')  # shift down
In [266]: plus
Out[266]: array([1, 2, 3, 2, 0, 1, 0, 0])
In [267]: minus
Out[267]: array([2, 2, 1, 2, 3, 2, 0, 1])
In [268]: (x>plus) & (x>minus)             # compare x with shifted arrays
Out[268]: array([False, False, False,  True, False, False,  True, False], dtype=bool)
In [269]: np.where(_)
Out[269]: (array([3, 6], dtype=int32),)
In [270]: np.where((x<plus) & (x<minus))
Out[270]: (array([1, 5], dtype=int32),)
In [271]: np.where(((x<plus) & (x<minus)) | (x>plus) & (x>minus))
Out[271]: (array([1, 3, 5, 6], dtype=int32),)