2017-09-25 16 views
2

私はstatistics.mean()を使用して、サンプリングされた分布から平均を計算します。ただし、次のコードでは、次の値からの戻り値は整数に丸められています。代わりにnumpy.mean()を使用すると、正しいfloat型の結果が得られます。ではここで何が起こっているのですか?なぜpython statistics.mean()は浮動小数点型ではなくint型を返します

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.meannumpy.int64データ型をサポートしていません。 statisticsためdocsから

明示的に特に断りのない限り、これらの機能をサポートint型、float型、 decimal.Decimalとfractions.Fraction。他のタイプの動作(数値タワー内であるかどうかにかかわらず)は現在サポートされていません( )。混合型 型も定義されておらず、実装に依存します。入力された データが混在型のデータである場合は、map()を使用して という一貫性のある結果を確実に得ることができます。 map(float、input_data)

これを回避するには、お勧めの方法でデータをfloatに変換してからstatistics.mean()に転送します。この行動の背後にある根本的な理由のために今

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

source codeの終わりに

statistics.meanため、適切な型に返された値を変換するためのものですstatistics._convertへの呼び出しがあり、 (入力が小数である場合は小数、入力がintなどの場合はfloat)。

try: 
    return T(value) 

_convertsingle lineは、他のデータ型をキャッチし、返された値が提供されたデータと一致していることを保証することを意味する(T各入力値のデータ型であり、valueは、計算された平均です)

入力がnumpy.int64の場合、_convert関数は計算された平均をnumpy.int64データ型に変換しようとします。 NumPyは浮動小数点数をうれしくintに変換します(私は考えます)。したがって、mean関数は、numpy.int64としてエンコードされた最も近い整数に丸められた平均を返します。

入力データがnumpy.float64の場合、この問題は発生しません。

+0

ニースキャッチ!どうも! – rifle123

+1

これがあなたの質問に答えるなら、下降記号の下にある中空のチェックマークをクリックして感謝の気持ちを示すことができます:) @ rifle123 – DJK

関連する問題