np.arange与浮点参数无法正常工作

时间:2018-12-02 13:39:49

标签: python numpy floating-point

尝试一下:

import numpy as np
np.arange(0,3*0.1,0.1)

输出将是:     array([0.,0.1,0.2,0.3])

这是不可思议的,因为对于np.arange,“值是在半开间隔内生成的值(开始,停止)”。我尝试了其他数字,发现只有3的倍数会触发这种现象:

np.arange(0,2*0.1,0.1).shape
# 2
np.arange(0,3*0.1,0.1).shape
# 4
np.arange(0,4*0.1,0.1).shape
# 4
np.arange(0,5*0.1,0.1).shape
# 5
np.arange(0,6*0.1,0.1).shape
# 7

我现在很困惑。有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

问题出在您的端点3 * 0.1上,它不等于0.3(请记住,Python和NumPy使用floating point arithmetic,其中某些数字(即0.1)不能准确表示)。

>>> 3 * 0.1
0.30000000000000004
>>> 0.3  
0.3  # or more exactly 0.299999999999999988897769753748...
>>> 3 * 0.1 == 0.3
False

因此包含0.3并不令人感到意外,因为端点(非常小)更大。

请注意,numpy.arange还包含以下公式:结果数组中将包含多少个元素:

ceil((stop - start)/step

>>> (3 * 0.1 - 0)/0.1
3.0000000000000004
>>> ceil(_)
4

浮点数运算非常棘手,特别是在比较浮点数是否相等时。为什么不创建整数数组并按除法创建所需的float数组呢?

>>> import numpy as np
>>> np.arange(0, 3, 1) / 10
array([0. , 0.1, 0.2])

numpy.linspace函数为浮点值提供更多选项:

>>> import numpy as np
>>> np.linspace(0.0, 3 * 0.1, 3, endpoint=False)
array([0. , 0.1, 0.2])