gpt4 book ai didi

python - Numpy to weak 计算精确的平均值

转载 作者:行者123 更新时间:2023-11-28 16:42:11 27 4
gpt4 key购买 nike

这个问题与this post非常相似- 但不完全是

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

在 Excel 或 SAS 中计算平均值给出的结果精确到第 5 位 (#.#####) 但使用 numpy 给出:

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

给出这样的数字

#.#####999999999994

显然出了点问题..

使用

from math import fsum
print fsum(rawD.ravel())/rawD.size

给予

#.#####

np.average 中是否有我设置错误的东西_______?


奖金信息:

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


更新

我想我应该更清楚地说明我的情况。

我的 csv 中有类似 4.2730 的数字(给出小数点后 4 位精度 - 尽管第 4 位始终为零 [不是主题的一部分,所以不要介意])

通过 numpy 计算平均值/平均值给了我这个

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.average() 计算这个值___?


我有点惊讶 numpy 对我做了这个......我认为我只需要担心我是否正在处理 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 - 它被修改了)

猜猜我的问题归结为如果我使用 =average()

我如何获得 excel 给我的字符串输出

enter image description here

如果我选择只显示 4 位数字,请正确舍入

enter image description here

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

如有任何帮助,我们将不胜感激。

最佳答案

要获得精确的十进制数,您需要使用十进制算术而不是二进制。 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

关于python - Numpy to weak 计算精确的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17945295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com