假设我有一个时间序列,例如:
[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
或0
。
似乎必须有一个更好的方法。谷歌搜索的许多结果都给出了非二进制输出。我可以使用一些scipy功能吗?
答案 0 :(得分:1)
有两个类似的功能可以为您提供帮助: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),)
然后,您只需替换这些元素即可。