matplotlib argrelmax 找不到所有最大值

1 python scipy sampling

我有一个项目,我正在对模拟数据进行采样并尝试使用 matplotlib 进行分析。目前,我的模拟数据源是连接到微控制器的电位计,但这与问题无关。这是我的代码

arrayFront = RunningMean(array(dataFront), 15)
arrayRear = RunningMean(array(dataRear), 15)
x = linspace(0, len(arrayFront), len(arrayFront))  # Generate x axis
y = linspace(0, len(arrayRear), len(arrayRear))  # Generate x axis
min_vals_front = scipy.signal.argrelmin(arrayFront, order=2)[0]  # Min
min_vals_rear = scipy.signal.argrelmin(arrayRear, order=2)[0]  # Min
max_vals_front = scipy.signal.argrelmax(arrayFront, order=2)[0]  # Max
max_vals_rear = scipy.signal.argrelmax(arrayRear, order=2)[0]  # Max
maxvalfront = max(arrayFront[max_vals_front])
maxvalrear = max(arrayRear[max_vals_rear])
minvalfront = min(arrayFront[min_vals_front])
minvalrear = min(arrayRear[min_vals_rear])
plot(x, arrayFront, label="Front Pressures")
plot(y, arrayRear, label="Rear Pressures")
plot(x[min_vals_front], arrayFront[min_vals_front], "x")
plot(x[max_vals_front], arrayFront[max_vals_front], "o")
plot(y[min_vals_rear], arrayRear[min_vals_rear], "x")
plot(y[max_vals_rear], arrayRear[max_vals_rear], "o")
xlim(-25, len(arrayFront) + 25)
ylim(-1000, 7000)
legend(loc='upper left')
show()
Run Code Online (Sandbox Code Playgroud)

dataFront 和 dataRear 是 Python 列表,用于保存来自 2 个电位计的采样数据。RunningMean 是一个函数,它调用:

convolve(x, ones((N,)) / N, mode='valid')
Run Code Online (Sandbox Code Playgroud)

问题是 argrelmax(和 min)函数并不总能找到所有的最大值和最小值。有时它找不到任何最大值或最小值,这会导致我在此代码块中出现问题

maxvalfront = max(arrayFront[max_vals_front])
maxvalrear = max(arrayRear[max_vals_rear])
minvalfront = min(arrayFront[min_vals_front])
minvalrear = min(arrayRear[min_vals_rear])
Run Code Online (Sandbox Code Playgroud)

因为 [min_vals_(blank)] 变量是空的。有谁知道这里发生了什么,我能做些什么来解决这个问题?提前致谢。

这是未找到所有最大值和最小值的数据图表之一:

在此处输入图片说明

unu*_*tbu 5

signal.argrelmin是一个signal.argrelextrema带有comparator=np.less. np.less(a, b)返回a < b逐元素的真值。请注意,np.less要求a严格小于 b它是真实的。

您的数据在许多相邻位置具有相同的最小值。在局部最小值处,局部最小值与其邻居之间的不等式不满足严格小于关系;相反,它只满足严格小于或等于关系。

因此,要找到这些极值用signal.argrelmincomparator=np.less_equal。例如,使用数据中的一个片段:

import numpy as np
from scipy import signal

arrayRear = np.array([-624.59309896, -624.59309896, -624.59309896,
                      -625., -625., -625.,])

print(signal.argrelmin(arrayRear, order=2)[0])
# []

print(signal.argrelextrema(arrayRear, np.less_equal)[0])
# [0 1 3 4 5]

print(signal.argrelextrema(arrayRear, np.less_equal, order=2)[0])
# [0 3 4 5]
Run Code Online (Sandbox Code Playgroud)