我有一个项目,我正在对模拟数据进行采样并尝试使用 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)] 变量是空的。有谁知道这里发生了什么,我能做些什么来解决这个问题?提前致谢。
这是未找到所有最大值和最小值的数据图表之一:

signal.argrelmin是一个signal.argrelextrema带有comparator=np.less. np.less(a, b)返回a < b逐元素的真值。请注意,np.less要求a要严格小于 b它是真实的。
您的数据在许多相邻位置具有相同的最小值。在局部最小值处,局部最小值与其邻居之间的不等式不满足严格小于关系;相反,它只满足严格小于或等于关系。
因此,要找到这些极值用signal.argrelmin带comparator=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)
| 归档时间: |
|
| 查看次数: |
2490 次 |
| 最近记录: |