我使用statistics.mean()从抽样分布计算平均值。但是,在下面的代码中,从以下值返回的值是四舍五入整数。如果我使用numpy.mean()代替,将得到正确的浮动类型的结果。这是怎么回事?
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]))发布于 2017-09-25 01:14:10
statistics.mean不支持numpy.int64数据类型。
来自文档 for statistics
除非另有明确说明,否则这些函数支持int、float、decimal.Decimal和fractions.Fraction。其他类型(无论是否在数字塔中)的行为目前不受支持。混合类型也是未定义和与实现相关的.如果输入数据包含混合类型,则可以使用map()来确保一致的结果,例如map(float,input_data)。
为了解决这个问题,您可以按照建议进行,并在传递到float之前将数据转换为statistics.mean()。
print(statistics.mean(map(float, predictive_sample)))现在,由于这种行为背后的根本原因,:
在源代码 for statistics.mean的末尾,有一个对statistics._convert的调用,这意味着将返回的值转换为适当的类型(即如果输入为分数,则为分数,如果输入为int,则为float )。
单线在_convert中用于捕获其他数据类型,并确保返回的值与提供的数据一致(T是每个输入值的数据类型,value是计算的平均值):
try:
return T(value)如果输入是numpy.int64,则_convert函数尝试将计算的平均值转换为numpy.int64数据类型。NumPy愉快地将浮点数转换为int (我认为是四舍五入的)。因此,mean函数返回平均四舍五入到最近的整数,编码为numpy.int64。
如果您的输入数据是numpy.float64,那么您就不会遇到这个问题。
https://stackoverflow.com/questions/46396273
复制相似问题