实现一个一维的中位数滤波器。
形式化地来说,给出一个长度为n的数列a_1,a_2,a_3,…,a_n,# 求一个数列b_1,b_2,…,b_{n-k+1},使得b_i是子列(a_i,a_{i+1},…,a_{i+k-1})的中位数。
可以理解为一个长度为k的滑窗在长度为n的数列上滑动,每滑一次输出滑窗里面的数的中位数。
a = [1,2,3,12,-5,33]
k = 3
b = [2,3,3,12]b
def find_mid(window, k): if k % 2 == 0: return (window[k//2-1] + window[k//2]) / 2 else: return window[k//2] def insert(window, new): for index, value in enumerate(window): if value >= new: return window[:index] + [new] + window[index:] return window + [new] def solution(a, k): window = sorted(a[:k]) result = [find_mid(window, k)] for index, value in enumerate(a[k:]): window.remove(a[index]) window = insert(window, value) result += [find_mid(window, k)] return result if __name__ == "__main__": a = [1,2,3,12,-5,33,44,0] k = 4 result = solution(a, k) print(result)