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有帮助吗?记住,如果有,你可以投票/接受,看是的,这非常有帮助。“移动平均线”正是我想要的。投票通过并被接受。非常感谢你。