import numpy as np
from scipy.signal import argrelextrema
data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 1, 0 ])
filter_table = [False] + list(np.equal(data[:-1], data[1:]))
data = np.array([x for idx, x in enumerate(data) if not filter_table[idx]])
argrelextrema(data, np.greater)
2条答案
按热度按时间ibrsph3r1#
简短回答:
argrelextrema
可能不够灵活,无法满足您的任务。请考虑编写符合您需要的函数。**更长的答案:**您一定要使用
argrelextrema
吗?如果是的话,那么您可以使用argrelextrema
的comparator
和order
参数(请参阅reference)。对于您的简单示例,选择
np.greater_equal
作为comparator
就足够了。然而注意,这样
它的行为与你可能希望的不同,找到第一个
3
和4
作为最大值,因为argrelextrema
现在将所有值都视为大于或等于其两个最近邻居的最大值。选择order=2
将改变我上面的示例,只找到4
作为最大值。但是,这也有一个缺点-让我们再次更改数据:
添加另一个峰作为最后一个值会使您无法找到
4
处的峰,因为argrelextrema
现在看到的第二近邻大于4
(这对于有噪声的数据可能很有用,但不一定是所有情况下的预期行为)。使用
argrelextrema
,您将始终被限制为在固定数量的邻居之间进行二元运算。但是,请注意,在上面的示例中,argrelextrema
所做的全部工作是返回n
,ifdata[n] > data[n-1] and data[n] > data[n+1]
。您可以自己轻松地实现这一点,然后细化规则,例如,通过检查第二个邻居,以防第一个邻居具有相同的值。为了完整起见,
scipy.signal
中似乎有一个更复杂的函数find_peaks_cwt
。但是我没有使用它的经验,因此不能给予你更多的细节。5tmbdcev2#
我真的很惊讶没有人能找到答案。你所需要做的就是对数组进行预处理,删除相邻的重复项,然后运行argrelextrema,如下所示: