gpt4 book ai didi

python - 如何修复 numpy 浮点运算产生不精确结果的问题?

转载 作者:行者123 更新时间:2023-12-01 09:04:26 25 4
gpt4 key购买 nike

我需要根据已知样本大小的相对频率重建绝对频率。

这应该很简单,但绝对频率和样本大小为 numpy.int64,相对频率为 numpy.float64

我知道浮点十进制值通常没有精确的二进制表示形式,我们可能会遇到一些精度损失。情况似乎是这样,浮点运算产生了意想不到的结果,我不能相信重建的绝对频率。

复制错误的示例代码:

import pandas as pd
import numpy as np

absolutes = np.arange(100000, dtype=np.int64) #numpy.int64
sample_size = absolutes.sum() # numpy.int64
relatives = absolutes / sample_size #float64

# Rebuilding absolutes from relatives

rebuilt_float = relatives * sample_size #float64
rebuilt_int = rebuilt_float.astype(np.int64)

df = pd.DataFrame({'absolutes': absolutes,
'relatives': relatives,
'rebuilt_float': rebuilt_float,
'rebuilt_int': rebuilt_int})

df['check_float'] = df['absolutes'] == df['rebuilt_float']
df['check_int'] = df['absolutes'] == df['rebuilt_int']

print('Failed FLOATS: ', len(df[df['check_float'] == False]))
print('Failed INTS:', len(df[df['check_int'] == False]))
print('Sum of FLOATS:', df['rebuilt_float'].sum())
print('Sum of INTS:', df['rebuilt_int'].sum())

是否可以使用 numpy 解决问题而不将每个数字都转换为小数?

最佳答案

np.isclose(df['absolutes'], df['rebuilt_float'], atol=.99999)

numpy.isclose()是不精确的 fp 感知比较。它有一个额外的参数 atolrtol 用于相对和绝对容差。

您可以通过更改atol来查看消除了多少舍入误差:

>>> len(np.where( np.isclose(df['absolutes'], df['rebuilt_int'], atol=.99999) == False )[0])
0
>>> len(np.where( np.isclose(df['absolutes'], df['rebuilt_int'], atol=.5) == False )[0])
2767
>>> len(np.where( np.isclose(df['absolutes'], df['rebuilt_int'], atol=1) == False )[0])
0

关于python - 如何修复 numpy 浮点运算产生不精确结果的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52185208/

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