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.argrelextrema
用 np.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)>0
或 a'(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 项满足最大值的索引。
我有一个关于在 numpy
数组中寻找最大值或更精确的不连续点的问题?
我的示例数据看起来像这样
a = np.array([3,4,5,8,7,6,5,4,1])
总的来说,我对数据中的每一个maximum/jump都感兴趣。对于数组 a
,我想检测 8,因为它是最大值(左侧的数字增加,右侧的数字减少)和 4 的值,因为数据在该值之后下降。到目前为止,我已经使用 scipy.signal.argrelextrema
用 np.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)>0
或 a'(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 项满足最大值的索引。