Python 查找列表中每个元素的中间值

Python 查找列表中每个元素的中间值,python,numpy,statistics,Python,Numpy,Statistics,我有一些大的数据列表,在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(

我有一些大的数据列表,在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]])

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]
对于任意大小的组非常方便,因为您可以设置最大大小。然后,您只需将项目推到一端,它就会从另一端移除项目以保持大小。下面是一个生成器示例,它将您的组大小设置为
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]

您计算的值太多,因为:

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

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]
对于任意大小的组非常方便,因为您可以设置最大大小。然后,您只需将项目推到一端,它就会从另一端移除项目以保持大小。下面是一个生成器示例,它将您的组大小设置为
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]

你是对的,我计算了很多值。。。使用滚动中值函数,我的任务简单多了,谢谢!你是对的,我计算了很多值。。。使用滚动中值函数,我的任务简单多了,谢谢!