2017-09-25 282 views
2

我使用statistics.mean()來計算採樣分佈的均值。但是,在下面的代碼中,下面值的返回值是四捨五入的整數。如果我使用numpy.mean(),將會得到正確的浮點類型結果。那麼這裏發生了什麼?爲什麼python statistics.mean()返回一個int類型,而不是float

import statistics 
from scipy import stats 

posterior_sample = stats.beta.rvs(3, 19, size = 1000) 
predictive_sample = stats.binom.rvs(100, posterior_sample, size = 1000) 
print(statistics.mean(predictive_sample)) 
print(statistics.mean([(data >= 15).astype(int) for data in predictive_sample])) 
+2

一個簡單的例子:'statistics.mean([6,7,8,9])'和'statistics.mean(np.array([6,7,8,9]))''。 –

回答

4

statistics.mean不支持numpy.int64數據類型。

docsstatistics

除非另有明確說明,這些功能支持整數,浮點, decimal.Decimal和fractions.Fraction。其他類型的行爲 (無論是否在數字塔中)當前不受支持。混合 類型也是未定義和實現相關的。如果您輸入的數據由混合類型組成,您可能可以使用map()來確保一致的結果,例如, map(float,input_data)。

要解決這個問題,你可以做的建議,並傳遞給statistics.mean()之前,你的數據轉換爲float

print(statistics.mean(map(float, predictive_sample))) 

現在對於這種行爲背後的根本原因:

source codestatistics.mean結束,還有就是statistics._convert一個電話,其目的是要返回的值轉換爲適當的類型(即分數如果輸入是分數,float如果輸入是int等)。

_convertsingle line旨在捕獲其他數據類型,並確保該返回值是與所提供的數據是一致的(T是對於每個輸入值的數據類型,value是所計算的平均值):

try: 
    return T(value) 

如果您的輸入是numpy.int64,那麼_convert函數會嘗試將計算出的平均值轉換爲numpy.int64數據類型。 NumPy很高興地將float轉換爲int(我認爲是向下舍入)。因此mean函數返回一個四捨五入到最接近的整數的均值,編碼爲numpy.int64

如果你的輸入數據是numpy.float64,那麼你就不會有這個問題。

+0

好的,趕上!謝謝! – rifle123

+1

如果這回答你的問題,你可以通過點擊downvote符號下面的空心複選標記來標記它,以表示你的讚賞:) @ rifle123 – DJK

相關問題