正如在以前的帖子中很好地回答的那样,这是编程语言中常见的浮点算术问题。你应该知道永远不要对float
类型应用完全相等。
当您进行此类比较时,您可以使用基于给定容差(阈值)进行比较的函数。如果数字足够接近,则应将它们视为数量相等。就像是:
def isequal_float(x1,x2, tol=10**(-8)):
"""Returns the results of floating point equality, according to a tolerance."""
return abs(x1 - x2)<tol
会成功的。如果我没记错的话,确切的公差取决于float
类型是单精度还是双精度,这取决于您使用的语言。
使用这样的函数可以让您轻松比较计算结果,例如在numpy
. 让我们以以下示例为例,其中使用两种方法为具有连续变量的数据集计算相关矩阵:pandas
方法pd.DataFrame.corr()
和numpy
函数np.corrcoef()
:
import numpy as np
import seaborn as sns
iris = sns.load_dataset('iris')
iris.drop('species', axis = 1, inplace=True)
# calculate correlation coefficient matrices using two different methods
cor1 = iris.corr().to_numpy()
cor2 = np.corrcoef(iris.transpose())
print(cor1)
print(cor2)
结果似乎相似:
[[ 1. -0.11756978 0.87175378 0.81794113]
[-0.11756978 1. -0.4284401 -0.36612593]
[ 0.87175378 -0.4284401 1. 0.96286543]
[ 0.81794113 -0.36612593 0.96286543 1. ]]
[[ 1. -0.11756978 0.87175378 0.81794113]
[-0.11756978 1. -0.4284401 -0.36612593]
[ 0.87175378 -0.4284401 1. 0.96286543]
[ 0.81794113 -0.36612593 0.96286543 1. ]]
但它们完全相等的结果却不是。这些运算符:
print(cor1 == cor2)
print(np.equal(cor1, cor2))
将主要False
产生元素方面的结果:
[[ True False False False]
[False False False False]
[False False False False]
[False False False True]]
同样,np.array_equal(cor1, cor2)
也会 yield False
。但是,定制功能提供了您想要的比较:
out = [isequal_float(i,j) for i,j in zip(cor1.reshape(16, ), cor2.reshape(16, ))]
print(out)
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
注意: numpy
包括.allclose()
在 numpy 数组中执行浮点逐元素比较的功能。
print(np.allclose(cor1, cor2))
>>>True