数值到弱来计算一个精确的平均值

2024-10-03 13:22:10 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题与this post非常相似,但并不完全相同

我在一个.csv文件中有一些数据。数据精确到第四位(#。###################。在

在Excel或SAS中计算平均值可以得到精确到第五位数的结果,但是使用numpy可以得到:

import numpy as np
data = np.recfromcsv(path2file, delimiter=';', names=['measurements'], dtype=np.float64)
rawD = data['measurements']
print np.average(rawD)

给出一个这样的数字

999999999 4

显然出了什么问题。。在

使用

^{pr2}$

给予

Š

里面有什么东西吗np.平均值我弄错了?在


奖金信息:

我只处理数组中的200个数据点


更新

我想我应该把我的情况说清楚。在

我在csv中有类似4.2730的数字(提供4个十进制精度-即使第4个总是零[不是主题的一部分,所以不要介意])

用纽比计算平均数

4.2516499999999994

打印出来的

>>>print "%.4f" % np.average(rawD)
4.2516

在Excel或SAS中进行同样的操作时,我会看到:

4.2517

我认为这是真正的平均值,因为它发现它是4.25165。 同时说明以下代码:

answer = 0
for number in rawD:
    answer += int(number*1000)
print answer/2
425165

那我怎么说呢np.平均值()来计算这个值?在


我有点惊讶纽比这么对我。。。我想我只需要担心如果我处理的是16位数的数字。没想到小数点后4位的四舍五入会受此影响。。在

我知道我可以利用

fsum(rawD.ravel())/rawD.size

但我还有其他的东西,比如std,我想用同样的精度来计算

更新2

我想我可以通过

>>>print "%.4f" % np.float64("%.5f" % np.mean(rawD))
4.2416

但这并没有解决这个案子。然后我试过了

>>>print "%.4f" % float("4.24165")
4.2416

啊哈!格式化程序中有一个错误:Issue 5118

老实说,我不在乎python是否将4.24165存储为4.241649999。。。不管怎样,这仍然是一个舍入错误。在

如果对讲机能想出如何显示数字

>>>print float("4.24165")
4.24165

那么格式化程序也应该在舍入时处理这个数字。。在

它仍然没有改变我有一个舍入问题的事实(现在格式化程序和numpy都有)

如果您需要一些数字来帮助我,那么我已经制作了这个修改过的.csv文件:

Download it from here

(我知道这个文件没有我之前解释过的位数,平均值在结尾给出了..9988,而不是..9994-它被修改了)

我想我的问题归结为如何得到一个字符串输出,就像excel在使用=average()时给我的那样

enter image description here

如果我选择只显示4个数字,就要把它修约好

enter image description here

我知道这对某些人来说可能很奇怪。。但是我有我想要重现Excel行为的理由。在

任何帮助都将不胜感激,谢谢。在


Tags: 文件csv数据answer程序numpydatanp
2条回答

要获得精确的十进制数,需要使用十进制算术而不是二进制。Python为此提供了decimal module。在

如果您想继续使用numpy进行计算并简单地对结果进行四舍五入,您仍然可以使用decimal进行此操作。你可以分两步来做,舍入到一个大的数字以消除累积误差,然后四舍五入到所需的精度。quantize方法用于舍入。在

from decimal import Decimal,ROUND_HALF_UP
ten_places = Decimal('0.0000000001')
four_places = Decimal('0.0001')
mean = 4.2516499999999994
print Decimal(mean).quantize(ten_places).quantize(four_places, rounding=ROUND_HALF_UP)
4.2517

平均值的结果值是一个双倍。当打印出双精度时,默认情况下会打印所有数字。你在这里看到的是有限的数字精度的结果,这不是一个数字问题,而是一个普遍的计算问题。当您关心浮点值的表示时,请使用"%.4f" % avg_val。还有一个有理数的包,以避免将分数表示为实数,但我想这不是你想要的。在

对于第二个语句,手工汇总所有值,然后除以它,我假设您使用的是Python2.7,所有输入值都是整数。这样,就有了一个整数除法,它会截断点后面的所有内容,从而得到另一个整数值。在

相关问题 更多 >