【发布时间】:2020-02-19 21:17:59
【问题描述】:
我在时间序列信号上尝试了以下python中值滤波,以找到最快和更有效的函数。
sig 是一个 numpy 数组,大小为 80×188,其中包含由 80 个传感器测量的 188 个样本。
import numpy as np
from scipy.ndimage import median_filter
from scipy.signal import medfilt
from scipy.signal import medfilt2d
import time
sig = np.random.rand(80,188).astype('f')
print(type(sig))
print(type(sig[0][0]))
window_length = 181
t = time.time()
sigFiltered = medfilt2d(sig, (1,window_length))
elapsed = time.time() - t
print('scipy.signal.medfilt2d: %g seconds' % elapsed)
t = time.time()
sigFiltered = median_filter(sig, (1,window_length))
elapsed = time.time() - t
print('scipy.ndimage.median_filter: %g seconds' % elapsed)
t = time.time()
sigFiltered = medfilt(sig, (1,window_length))
elapsed = time.time() - t
print('scipy.signal.medfilt: %g seconds' % elapsed)
代码可以试试here。
过滤器的结果是另一个大小为80×188 的时间序列数组,每个传感器都有平滑的时间点。
MATLAB medfilt1(sig, 181, [], 2) 对相同数据执行过滤的速度比 scipy.signal.medfilt2d 快 10 倍,这是其他函数中最快的。在我的机器上,MATLAB=2ms vs Python=20ms。我认为 MATLAB 执行多线程处理,而 python 没有。
有没有什么方法可以执行多线程中值过滤来加快处理速度并将传感器分配给不同的线程? python中是否有更有效的中值过滤?能否达到MATLAB win python的性能或者至少更接近呢?
【问题讨论】:
-
你需要多快?
-
小于 1 毫秒。
-
过滤器长度应该是181?这是一个时间序列,您每 1 毫秒获得 80x185 个数据样本吗?
-
没错。
标签: python multithreading matlab numpy median