为什么会失败?我创建一个数组,用该数组减去数组中的一个值来创建一个新变量,然后将该数组与数组中出现的值进行比较。那么为什么平等测试会失败呢?
import numpy as np
import platform
print platform.python_version()
print np.__version__
x = np.arange( -1,1,0.1 )
new_x = x - x[5]
print new_x
print new_x == -0.2
输出:
2.7.9
1.9.2
[-0.5 -0.4 -0.3 -0.2 -0.1 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4]
[False False False False False False False False False False False False False False False False False False False False]
编辑: 使用 np.round() 会导致比较按预期进行;现在的问题是,为什么在打印数组时会出现四舍五入的数字?根据我的经验,当数字不准确时,Python 通常会打印科学记数法或仅打印一堆小数位。
令人震惊的是,我已经科学地使用 Python 编程 6 年了,但从未见过这种情况!这感觉像是一个菜鸟问题,但我真的不明白为什么打印的内容是四舍五入的。
最佳答案
正如您所怀疑的,奇怪的行为是由于浮点计算期间发生的小精度误差造成的。要查看差异,您可以使用 float.hex()
将 float 转换为十六进制形式。 :
>>> new_x[3].hex()
'-0x1.9999999999998p-3'
>>> (-0.2).hex()
'-0x1.999999999999ap-3'
请注意,它们实际上是两个不同的 float 。 “四舍五入”仅在打印时发生,实际上 Python itself does by default 。基本思想是 Python 对象(包括 float )有两种形式的字符串表示形式:str
和 repr
。虽然 repr
应返回“真实”、可重现的字符串表示形式,但 str
应针对人类可读性进行优化 - 其中一部分包括“舍入”,以隐藏小的精度误差。注意:
>>> repr(new_x[3])
'-0.19999999999999996'
>>> repr(-0.2)
'-0.2'
对于 float ,您可以使用 numpy.isclose()
模拟相等检查,像这样:
>>> print numpy.isclose(new_x, -0.2)
[False False False True False False False False False False False False
False False False False False False False False]
关于Python Numpy 数组相等失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226276/