python浮点数的处理

本文介绍了Python中浮点数的处理,包括生成浮点数的Series和DataFrame,浮点数的运算以及比较。浮点数由于二进制表示的局限性可能导致不精确的比较。建议使用`math.isclose()`和`np.allclose()`进行近似相等的比较,而非直接使用`==`。浮点数的处理是理解和掌握numpy及pandas库的关键。
摘要由CSDN通过智能技术生成

python浮点数的处理

浮点数一般是numpy,pandas最经常处理的数据类型。
掌握浮点数的操作很大程度上就相当于掌握了pandas。

本节目标:掌握numpy,pandas浮点数操作的一些常识

本节技术点:numpy,pandas

本节阅读需要(10)min。
本节实操需要(10)min。



前言

我们都知道计算机最底层是二进制的!!!
所以我们习以为常的十进制数据最终也是二进制表示。
不幸的是,大多数十进制小数不能完全用二进制小数表示。结果是,一般情况下,
开发者输入的十进制浮点数仅由实际存储在计算机中的近似的二进制浮点数表示。
这是二进制浮点数的自然性质:它不是 Python 中的一个 bug,也不是开发者的代码中的 bug。

最后我们要说,虽然对于不同场景下浮点数的处理“没有统一的答案”,但也不要过分惧怕浮点数。Python 浮点数计算中的误差源之于浮点数硬件,大多数机器上每次计算误差不超过 2**53 分之一。对于大多数任务这已经足够了,但是开发者要在心中记住这不是十进制算法,每个浮点数计算可能会带来一个新的舍入错误。


一、生成浮点数

一般浮点数都是随机生成,或者是等差数列。

series

生成随机一维数据

import pandas as pd
import numpy as np

n1 = np.random.randn(5)
s1 = pd.Series(n1,dtype="float")

DataFrame

生成随机正态分布的二维数据

n2 = np.random.randn(5,5)
df1 = pd.DataFrame(n2,dtype="float")

二、浮点数的运算

浮点数的加减乘除,前面numpy和pandas已经介绍过了,都是对位对齐的。

不再赘述。

三、浮点数的比较

重中之重,面试经常问的问题。

0.1+0.1 == 0.2 # True
0.8-0.1 == 0.7 # False

这就和底层的具体实现相关。但是我想说的是浮点数的比较应该是近似相等,而不是值的绝对相等。
前一个就是底层值相等。因为0.1二进制后不会有误差。但是0.7和0.3这种二进制都是近似的。所以有误差。

math.isclose()

import math
math.isclose(0.8-0.1,0.7)
math.isclose(0.8-0.1,0.7,rel_tol=1e-10)

rel_tol相当于允许的误差范围。

一般这个过程是人工实现的。做差让小于一个很小的值就算是相等

np.allclose()

s2 = s1.copy()
s2
s2 == s1
np.allclose(s2,s1)

a, b : array_like
Input arrays to compare.
rtol : float
The relative tolerance parameter (see Notes).
atol : float
The absolute tolerance parameter (see Notes).
equal_nan : bool
Whether to compare NaN’s as equal. If True, NaN’s in a will be considered equal to NaN’s in b in the output array

allclose是返回的所有元素比较的结果,取得是交集。有一个不在tolerance范围内就False。


总结

浮点数的最终存储是二进制的。但是二进制无法有效表示,所以取得是近似值。所以及时有的数十进制一模一样,
二进制也存在差异。

所以不能简单用==判断是否相等。
而应该作差小于一个很小的值,视情况而定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

演技拉满的白马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值