这个问题与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,我想用同样的精度来计算
我想我可以通过
>>>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文件:
(我知道这个文件没有我之前解释过的位数,平均值在结尾给出了..9988,而不是..9994-它被修改了)
我想我的问题归结为如何得到一个字符串输出,就像excel在使用=average()
时给我的那样
如果我选择只显示4个数字,就要把它修约好
我知道这对某些人来说可能很奇怪。。但是我有我想要重现Excel行为的理由。在
任何帮助都将不胜感激,谢谢。在
要获得精确的十进制数,需要使用十进制算术而不是二进制。Python为此提供了decimal module。在
如果您想继续使用numpy进行计算并简单地对结果进行四舍五入,您仍然可以使用
decimal
进行此操作。你可以分两步来做,舍入到一个大的数字以消除累积误差,然后四舍五入到所需的精度。quantize
方法用于舍入。在平均值的结果值是一个双倍。当打印出双精度时,默认情况下会打印所有数字。你在这里看到的是有限的数字精度的结果,这不是一个数字问题,而是一个普遍的计算问题。当您关心浮点值的表示时,请使用
"%.4f" % avg_val
。还有一个有理数的包,以避免将分数表示为实数,但我想这不是你想要的。在对于第二个语句,手工汇总所有值,然后除以它,我假设您使用的是Python2.7,所有输入值都是整数。这样,就有了一个整数除法,它会截断点后面的所有内容,从而得到另一个整数值。在
相关问题 更多 >
编程相关推荐