浮点数一般是numpy,pandas最经常处理的数据类型。 掌握浮点数的操作很大程度上就相当于掌握了pandas。
本节目标:掌握numpy,pandas浮点数操作的一些常识
本节技术点:numpy,pandas
本节阅读需要(10)min。 本节实操需要(10)min。
- python浮点数的处理
- 前言
- 一、生成浮点数
- series
- DataFrame
- 二、浮点数的运算
- 三、浮点数的比较
- math.isclose()
- np.allclose()
- 总结
我们都知道计算机最底层是二进制的!!! 所以我们习以为常的十进制数据最终也是二进制表示。 不幸的是,大多数十进制小数不能完全用二进制小数表示。结果是,一般情况下, 开发者输入的十进制浮点数仅由实际存储在计算机中的近似的二进制浮点数表示。 这是二进制浮点数的自然性质:它不是 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。
总结浮点数的最终存储是二进制的。但是二进制无法有效表示,所以取得是近似值。所以及时有的数十进制一模一样, 二进制也存在差异。
所以不能简单用==判断是否相等。
而应该作差小于一个很小的值,视情况而定。