NumPy linspace舍入错误
有人能解释一下使用 numpy.linspace
时出现的这个四舍五入问题吗?
import numpy as np
np.linspace(0, 1, 6) == np.around( np.linspace(0, 1, 6), 10 )
# array([ True, True, True, False, True, True], dtype=bool)
我是在这个过程中得出这个结论的……
import numpy as np
## Two ways of defining the same thing
A = np.array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])
B = np.linspace(0, 1, 6)
## A and B appear to be the same
A # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])
B # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])
## They're not
A == B # array([ True, True, True, False, True, True], dtype=bool)
A - B # array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.11022302e-16, 0.00000000e+00, 0.00000000e+00])
## Gotta round to get my expected result
C = np.round( np.linspace( 0, 1, 6 ), 10 )
C # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])
A == C # array([ True, True, True, True, True, True], dtype=bool)
我定义 B
的方式看起来没什么问题……这个四舍五入的问题会在很多地方给我们带来麻烦吗?
1 个回答
8
这虽然听起来不太好,但这就是浮点数的特性,你得学会接受它。这就是你奇怪结果的来源:
>>> a = np.float(1)
>>> a /= 5
>>> a
0.2
>>> a*3
0.6000000000000001
你可以使用np.allclose
来帮助你处理这种情况,但如果你在比较浮点数时不够严谨,那它会一次又一次地给你带来麻烦。