Python 列表中每个连续段的平均值

Python 列表中每个连续段的平均值,python,list,numpy,average,Python,List,Numpy,Average,我有一份清单: sample_list = array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]) 我想计算每个元素的平均值,比如说4个元素。但不是单独的4个元素,而是前4个: 1,2,3,4 其次是: 2,3,4,5 3,4,5,6 其次是: 2,3,4,5 3,4,5,6 等等 结果将是第一个列表中每4个元素之间的平均值数组或列表 输出: array([2.5, 3.5, 4.5, ...]) 我的尝试: sample_list = [1

我有一份清单:

sample_list = array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])
我想计算每个元素的平均值,比如说4个元素。但不是单独的4个元素,而是前4个:

1,2,3,4
其次是:

2,3,4,5
3,4,5,6
其次是:

2,3,4,5
3,4,5,6
等等

结果将是第一个列表中每4个元素之间的平均值数组或列表

输出:

array([2.5, 3.5, 4.5, ...])
我的尝试:

sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
splits = 4

def avgerage_splits(data):
    datasum = 0
    count = 0 
    for num in data:
        datasum += num
    count += 1
    if count == splits: 
        yield datasum / splits
        datasum = count = 0
if count: 
    yield datasum / count

print(list(average_splits(sample_list)))

[1.5, 3.5, 5.5, 7.5, 9.5, 11.0]

这不是我需要的输出,因为这会在移动到一组新的4个元素之前计算每4个元素的平均值。我只想在列表中向上移动一个元素,然后计算这4个元素的平均值,依此类推。

您可以使用一行列表:

avgs = [sum(sample_list[i:i + splits]) / splits for i in range(len(sample_list) - splits + 1)]

当然,如果您想要一个生成器,请将方括号替换为圆括号。

如果
numpy
是一个选项,实现这一点的简单方法是使用,当使用以下数组进行卷积时,可以使用它来计算滚动平均值:

输出


细节

正在两个输入阵列之间执行。在这种情况下,
np.ones(w)
,它将是一个与指定窗口长度(在这种情况下为4)相同数量的数组
数组([1,1,1,1.])
示例列表

以下列表旨在复制
np.convolve
计算输出值的方式:

w = 4
np.array([sum(ones*sample_list[m:m+w]) for m in range(len(sample_list)-(w-1))]) / w 

array([ 2.5,  3.5,  4.5,  5.5,  6.5,  7.5,  8.5,  9.5, 10.5, 11.5, 12.5,
   13.5, 14.5])
因此,在每次迭代中,它将获取1数组和
sample\u list
的当前窗口之间的内积

Bellow是一个如何计算第一个输出的示例,以便更清楚一点。注意,在这种情况下,为卷积指定的使用模式是有效的,这意味着,重叠被指定为始终完整:

[1,1,1,1]
[1,2,3,4,5,6,7,8...]
= (1*1 + 1*2 + 1*3 + 1*4) / 4 = 2.5
以及下列各项:

  [1,1,1,1]
[1,2,3,4,5,6,7,8...]
= (1*2 + 1*3 + 1*4 + 1*5) / 4 = 3.5

依此类推,如前所述,产生移动平均值
sample\u list

您可以将函数
mean()
映射到压缩迭代器:

from statistics import mean
from itertools import islice

l = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

zip_iter = zip(*(islice(l, i, None) for i in range(4)))
list(map(mean, zip_iter))
# [2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5]

作为一个对大多数python模块知之甚少甚至一无所知的新程序员,下面是另一个解决方案。4是拆分的数目。它可以随时调整任意数量的分割。而3英寸(Len(nlis)-3)是4-1。因此,将3替换为分割数-1

nlis = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

summation = []
ave = []
for a in range(len(nlis)- 3):
    summation = sum(nlis[a:a+4])
    ave.append(summation/4)
print(ave)

# [2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5]

你能解释一下np.ones()的作用吗?这对@Murray有帮助吗?记住,如果有,你可以投票/接受,看是的,这非常有帮助。“移动平均线”正是我想要的。投票通过并被接受。非常感谢你。