尝试一下:
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
我现在很困惑。有人可以帮我吗?
答案 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])