我使用statistics.mean()来计算采样分布的均值。但是,在以下代码中,以下值的返回值是舍入整数。如果我使用numpy.mean()代替,将获得正确的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]))
答案 0 :(得分:4)
statistics.mean
不支持numpy.int64
数据类型。
来自statistics
的{{3}}:
除非另有明确说明,否则这些函数支持int,float, decimal.Decimal和fractions.Fraction。与其他类型的行为 (当前是否在数字塔中)目前不受支持。杂 类型也是未定义的和依赖于实现的。如果您输入 数据由混合类型组成,您可以使用map()来确保 一致的结果,例如map(float,input_data)。
要解决此问题,您可以按照建议进行操作,并在传递给float
之前将数据转换为statistics.mean()
。
print(statistics.mean(map(float, predictive_sample)))
现在找出这种行为背后的根本原因:
在statistics.mean
statistics._convert
的末尾,有一个float
调用,用于将返回值转换为适当的类型(即输入为分数时的分数) ,int
如果输入为_convert
等。
T
中的docs用于捕获其他数据类型,并确保返回的值与提供的数据一致(value
是每个输入值的数据类型, try:
return T(value)
是计算出的平均值):
numpy.int64
如果您的输入为_convert
,则numpy.int64
函数会尝试将计算的均值转换为mean
数据类型。 NumPy愉快地将浮点数转换为int(我认为是向下舍入)。因此numpy.int64
函数返回一个四舍五入到最接近整数的平均值,编码为numpy.float64
。
如果您的输入数据为 [[UIApplication sharedApplication] setApplicationIconBadgeNumber:12];
,那么您就不会遇到此问题。