Python 使用scipy.signal.argrelextrema同时查找局部极小值和极大值
我想在一个数组中同时找到局部极小值和极大值。我试图使用Scipy的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]]
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),)