假设我有一个时间序列,例如:
[1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 1, 1, 1, 1]
我知道信号中有一些噪音。我想尽可能地消除噪音并仍然输出二进制信号。上面的例子会变成如下:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1]
我已经实现了一种天真的基于规则的方法,其中我遍历值并且具有一些最小量的1
s或0
s我需要“交换”信号。
似乎必须有更好的方法来做到这一点。谷歌搜索的很多结果给出了非二进制输出。我可以利用一些scipy功能吗?
有两个类似的功能可以帮助你:scipy.signal.argrelmin和scipy.signal.argrelmax。在离散数组中搜索局部最小值/最大值。您应该将数组和邻居搜索半径作为order
传递。您的问题可以通过他们的组合来解决:
>>> a = np.asarray([1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 1, 1, 1, 1], int)
>>> signal.argrelmin(a, order=3)
(array([4], dtype=int32),)
>>> signal.argrelmax(a, order=3)
(array([15], dtype=int32),)
然后你可以只替换这些元素。