Python:查找 numpy 数组中的最大值和不连续点

Python: Find maxima and discontinuities in a numpy array

我有一个关于在 numpy 数组中寻找最大值或更精确的不连续点的问题? 我的示例数据看起来像这样

a = np.array([3,4,5,8,7,6,5,4,1])

总的来说,我对数据中的每一个maximum/jump都感兴趣。对于数组 a,我想检测 8,因为它是最大值(左侧的数字增加,右侧的数字减少)和 4 的值,因为数据在该值之后下降。到目前为止,我已经使用 scipy.signal.argrelextremanp.greater 来检测最大值,但我无法检测到这些 jumps/discontinuities。对于我正在查看的数据,只能跳转到更小的值,而不是相反。有没有简单的 pythonic 方法来检测这些跳跃?

让我们试试这个:

threshold = 1
a = np.array([3, 4, 5, 8, 7, 6, 5, 4, 1])
discontinuities_idx = np.where(abs(np.diff(a))>threshold)[0] + 1

np.diff(a) 给出了 a:

的每个分量之间的差异
>>> array([ 1,  1,  3, -1, -1, -1, -1, -3])

从那时起,np.where(abs(np.diff(a))>threshold)[0] 用于查找检测到的不连续点所在的位置(以上用户指定的 threshold 绝对差值)。最后,如果需要,您可以添加 +1 来补偿 n=1 差异 idx(参见 np.diff kwargs),具体取决于您需要在不连续性的哪一侧。

>>> discontinuities_idx
>>> array([3, 8])
>>> a[discontinuities_idx]
>>> array([8, 1])

你可以试试这个:

import numpy as np
import math
a = np.array([3,4,5,8,7,6,5,4,1])
MaxJump = np.diff(a)
print(MaxJump)
print(len(MaxJump))
MaxJump1 = []
for i in range (len(MaxJump)):
    MaxJump1.append(math.fabs(MaxJump[i]))
print(MaxJump1)
MaxJump3 = np.max(MaxJump1)
print(MaxJump3)

这听起来像是数学分析,您需要定义一些条件,例如 a'(x)>0a'(x)<0。所以你可以掩盖它们:

a = np.array([3,4,5,8,7,8,6,5,4,9,2,9,9,7])
mask1 = np.diff(a) > 0
mask2 = np.diff(a) < 0
>>> np.flatnonzero(mask1[:-1] & mask2[1:]) + 1
array([3, 5, 9], dtype=int64)

它 returns 项满足最大值的索引。