繁体   English   中英

查找列表中每个元素的中位数

[英]Find median for each element in list

我有一些大数据列表,介于 1000 到 10000 个元素之间。 现在我想借助中值函数过滤掉一些峰值。

    #example list with just 10 elements
    my_list = [4.5, 4.7, 5.1, 3.9, 9.9, 5.6, 4.3, 0.2, 5.0, 4.6]
    
    #list of medians calculated from 3 elements
    my_median_list = []
    for i in range(len(my_list)):
        if i == 0:
            my_median_list.append(statistics.median([my_list[0], my_list[1], my_list[2]])
        elif i == (len(my_list)-1):
            my_median_list.append(statistics.median([my_list[-1], my_list[-2], my_list[-3]])
        else:
            my_median_list.append(statistics.median([my_list[i-1], my_list[i], my_list[i+1]])

    print(my_median_list)
    # [4.7, 4.7, 4.7, 5.1, 5.6, 5.6, 4.3, 4.3, 4.6, 4.6]

到目前为止,这有效。 但我认为它看起来很丑,可能效率低下? 有没有办法用统计数据或 NumPy 来更快地做到这一点? 还是另一种解决方案? 此外,我寻找一个解决方案,我可以从计算中位数的元素数量中传递一个参数。 在我的示例中,我始终使用 3 个元素的中位数。 但是对于我的真实数据,我想使用中位数设置,然后可能使用 10 个元素中的中位数。

您计算的值太多,因为:

my_median_list.append(statistics.median([my_list[i-1], my_list[i], my_list[i+1]])

my_median_list.append(statistics.median([my_list[0], my_list[1], my_list[2]])

i == 1时相同。 同样的错误发生在最后,所以你得到了太多的最终值。

使用zip()更容易且不易出错,这将为您制作三个元素元组:

from statistics import median

my_list = [4.5, 4.7, 5.1, 3.9, 9.9, 5.6, 4.3, 0.2, 5.0, 4.6]

[median(l) for l in zip(my_list, my_list[1:], my_list[2:])]
# [4.7, 4.7, 5.1, 5.6, 5.6, 4.3, 4.3, 4.6]

对于任意大小的collections.deque组,非常方便,因为您可以设置最大大小。 然后,您只需在一端推动项目,然后从另一端移除项目以保持尺寸。 这是一个生成器示例,它将您的组大小设置为n

from statistics import median
from collections import deque

def rolling_median(l, n):
    d = deque(l[0:n], n)
    yield median(d)
    for num in l[n:]:
        d.append(num)
        yield median(d)
    
my_list = [4.5, 4.7, 5.1, 3.9, 9.9, 5.6, 4.3, 0.2, 5.0, 4.6]

list(rolling_median(my_list, 3))
# [4.7, 4.7, 5.1, 5.6, 5.6, 4.3, 4.3, 4.6]

list(rolling_median(my_list, 5))
# [4.7, 5.1, 5.1, 4.3, 5.0, 4.6]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM