我有一个列表:
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个元素的平均值。我只想在列表中上移一个元素,然后计算这四个元素的平均值,依此类推。
答案 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]