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

时间:2019-02-10 20:18:44

标签: python list numpy average

我有一个列表:

LinearLayout l = getActivity().findViewById(R.id.llpager);
                    l.removeAllViews();
                    BlankFragment3 fragment3 = new BlankFragment3();
                    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.llpager, fragment3);
                    fragmentTransaction.addToBackStack(null);
                    fragmentTransaction.commit();

我想计算每个元素(例如4个元素)的平均值。但不是分别包含4个元素,而是前4个元素:

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

其次:

1,2,3,4

其次:

2,3,4,5

以此类推。

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

输出:

3,4,5,6

我的尝试

array([2.5, 3.5, 4.5, ...])

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

4 个答案:

答案 0 :(得分:5)

如果使用numpy的一种简单方法是使用np.convolve,当与{的数组进行卷积时,可以用来计算滚动平均值 {3}}:

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])

详细信息

np.ones在两个输入数组之间执行np.convolve。在这种情况下,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

依此类推,如前所述,产生{i {1}}的移动平均值

答案 1 :(得分:4)

您可以使用单行列表理解:

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

当然,如果需要生成器,请用圆括号替换方括号。

答案 2 :(得分: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]

答案 3 :(得分:0)

作为一个几乎不了解大多数python模块的新程序员,这是另一种解决方案。 4是分割数。始终可以根据需要调整任意数量的分割。 (Len(nlis)-3)中的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]