2013-05-16 35 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

哦,對了!感謝您的幫助,非常有義務:) –