lis中每个连续段的平均值

2024-04-19 16:12:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个清单:

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

等等。你知道吗

结果将是第一个列表中每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个元素的平均值,以此类推。你知道吗


Tags: sample元素列表dataifdefcount数组
3条回答

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

import numpy as np
sample_list = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16], dtype=float)

w = 4
np.convolve(sample_list, np.ones(w), 'valid') / 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])

详细信息

^{}正在两个输入数组之间执行discrete convolution。在本例中np.ones(w),它将是一个与指定窗口长度(在本例中为4)一样多的数组array([1., 1., 1., 1.])sample_list。你知道吗

下面的列表旨在复制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_list窗口之间的内积。你知道吗

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

[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_list的移动平均值。你知道吗

您可以使用单行列表:

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

当然,如果你想要一个发电机,就用圆括号代替方括号。你知道吗

可以将函数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]

相关问题 更多 >