np.arange中的行为不一致?



当我运行时:

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])

最新更新