2013-05-16 38 views
0

我有一组数据点,我已经制作了一个程序来查看数据集,从该集中取n个点,然后求和并将其放入一个新列表中。并且,我可以制作一个简单的条形图。在python中计算离散均值

现在我想为我的新列表计算离散均值。

我使用的公式是这样的:t_av=(1/nsmp) Sum[N_i*t_i,{i,n_l,n_u}]
基本上我有一个在他们N_i数nsmp箱,t_i是一个箱的时间,n_l是第一个纸槽,n_u是最后一个垃圾桶。

所以,如果我的名单是这样的:[373, 156, 73, 27, 16]
我有5个箱,我有:t_av=1/5 (373*1+156*2+73*3+27*4+16*5)=218.4

现在我遇到了一个问题。我试着用这样的:

for i in range(0,len(L)): 
    sr_vr = L[i]*i 

tsr=sr_vr/nsmp 

哪里nsmp是垃圾箱我可以设置的数量,我有L计算。由于范围将从0,1,2,3,4开始,所以我不会得到正确的答案,因为我的第一个bin是按0计算的。如果我说range(1,len(L)+1)我会得到IndexError: list index out of range,因为这会混淆L[i]*i部分因为他仍然会将列表中的第二(1)元素与1相乘,然后他将成为最后一部分的一个简短条目。

我该如何纠正?

回答

1

您可以使用L[i]*(i+1)(假设您坚持从零开始索引)。

但是你也可以使用enumerate()遍历索引和值加在一起,你甚至可以提供1作为第二个参数,使索引开始于1而不是0

这是我怎么会这样写:

tsr = sum(x * i for i, x in enumerate(L, 1))/len(L) 

请注意,如果你是Python的2.x和L完全包含整数这将执行整数除法。获取浮点数只需将其中一个参数转换为浮点数(例如float(len(L)))。您也可以使用from __future__ import division

+0

你的第二个版本的作品,而L [i] *(i + 1)给出了错误的答案。我不会想到第二种方式,这是完美的。我会在8分钟内接受它:D顺便说一句,我仍然dk为什么这个简单的循环无法正常工作:\ 编辑:我有'__future__'部分:) –

+1

您正在'sr_vr'上重新分配一个新值每次迭代,当你想保持一个运行的总和而不是。所以你可以在循环之前加上'sr_vr = 0',然后在循环中使用'sr_vr + = L [i] *(i + 1)'。 –

+0

哦,对了!感谢您的帮助,非常有义务:) –