Python Numpy数组相等失败

时间:2015-07-05 00:40:08

标签: python numpy

为什么这会失败?我创建一个数组,用该数组创建一个新变量减去数组中的值,然后将数组与出现的值进行比较。那么为什么平等测试会失败呢?

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年,从未见过这个!这感觉就像一个菜鸟问题,但我真的不明白为什么打印的是圆形的。

1 个答案:

答案 0 :(得分:3)

正如您所怀疑的,奇怪的行为是由于在浮点计算期间发生的小精度错误。要查看差异,可以使用float.hex()

将浮点数转换为十六进制格式
>>> new_x[3].hex()
'-0x1.9999999999998p-3'
>>> (-0.2).hex()
'-0x1.999999999999ap-3'

请注意,它们实际上是两个不同的浮点数。 "舍入"仅在打印时发生,实际上是Python itself does by default。基本思想是Python对象(包括浮点数)有两种形式的字符串表示形式:strrepr。虽然repr应该返回一个"真实的",可重现的字符串表示,str应优化人类可读性 - 其中一部分包括"舍入",以隐藏精度误差小。注意:

>>> repr(new_x[3])
'-0.19999999999999996'
>>> repr(-0.2)
'-0.2'

对于浮点数,您可以使用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]