当我运行时:
import numpy as np
np.arange(14.1,15.1,0.1)
我得到:
array([14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15. ])
然而当我运行时:
np.arange(15.1,16.1,0.1)
我得到:
array([15.1, 15.2, 15.3, 15.4, 15.5, 15.6, 15.7, 15.8, 15.9, 16. , 16.1])
失踪的15.1
是怎么回事?为什么在一种情况下输出显示最终数字,而在另一种情况下不显示?
我已经阅读了有关 numpy-arange的文档。它指出"间隔不包括停止值,除非在某些情况下步长不是整数并且浮点舍入会影响 out 的长度。
我的问题是:如何让代码行为一致?
我正在迭代配对数字列表(例如 4 和 15,或 44.2 和 46.4(,对于每对,我想创建一个列表,在对之间步长为 0.1(例如 4 和 4.5 将是:4.1、4.2、4.3、4.4、4.5(。但重要的是,代码的行为要一致。
这是由于浮点精度。查看不带任何舍入的浮点数的实际十进制表示形式会更清楚:
15.1%1
# 0.09999999999999964
16.1%1
# 0.10000000000000142
请注意,就像 python 的range
一样,np.arange
不包括创建范围内的end
,因此除非浮点误差导致值大于范围end
中的步长,否则它不会被包括在内。这是第一个float
的情况,它的小数部分小于0.1
。
文档确实建议在使用非整数步骤时使用np.linspace
,因为结果可能不一致,正是由于上述原因。 此外,它还包含一个endpoint
参数,它允许您执行以下操作:
np.linspace(14.1,15.1, 11, endpoint=True)
# array([14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15. , 15.1])
而且,正如@divakar所建议的,为了概括,您可以将num
设置为:
start = 14.1
stop = 15.1
step = 0.1
num = 1+int((stop-start)/step)
np.linspace(start, stop, num, endpoint=True)
# array([14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15. , 15.1])