当我跑步时: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的文档。它声明“间隔不包括停止值,除非在某些情况下步长不是整数并且浮点舍入会影响输出的长度。”我的问题是: 如何让代码表现一致?我正在遍历成对数字列表(例如 4 和 15,或 44.2 和 46.4),对于每一对,我想创建一个列表,两对之间的步长为 0.1(例如 4 和 4.5 将是:4.1、4.2、 4.3、4.4、4.5)。但重要的是代码行为一致。
1 回答
繁星coding
TA贡献1797条经验 获得超4个赞
这是由于浮点精度。查看浮点数的实际十进制表示而不进行任何舍入将使它更清楚:
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])
添加回答
举报
0/150
提交
取消