2017-09-25 284 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

相关问题