Python Numpy 数组相等失败

标签 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 年了,但从未见过这种情况!这感觉像是一个菜鸟问题,但我真的不明白为什么打印的内容是四舍五入的。

最佳答案

正如您所怀疑的,奇怪的行为是由于浮点计算期间发生的小精度误差造成的。要查看差异,您可以使用 float.hex() 将 float 转换为十六进制形式。 :

>>> new_x[3].hex()
'-0x1.9999999999998p-3'
>>> (-0.2).hex()
'-0x1.999999999999ap-3'

请注意,它们实际上是两个不同的 float 。 “四舍五入”仅在打印时发生,实际上 Python itself does by default 。基本思想是 Python 对象(包括 float )有两种形式的字符串表示形式:strrepr。虽然 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/

相关文章:

python - 如何使用 python - selenium 截屏?

python - 如何根据变量匹配两个文件?

python - 如何使用 PyTorch 修剪/移除张量的一部分以匹配另一个张量的形状?

python - 如何在 Python 中计算自协方差

python - 列表到 numpy 数组转换可能的错误

python - 在 Heroku Python Virtualenv 中找不到 Django

python - go bot with minimax tree search 太慢了

python - 在逻辑中使用 numpy 形状输出

python - 比较两个时间序列(模拟结果)

python - numpy 对角线函数很慢