有比 Numpy arange() 更好的替代方法吗?

对于下面的代码,我希望范围停止在值 1.0,但它一直上升到 1.099999...,这是有道理的,因为它是一个浮点值。


创建步长为 0.1 的范围的更好方法是什么?


import numpy as np


start = 0.5

stop = 1.0

step = 0.1


for parameter_value in np.arange(start, stop + step, step):

  print(parameter_value)

输出


0.5

0.6

0.7

0.7999999999999999

0.8999999999999999

0.9999999999999999

1.0999999999999999


POPMUISE
浏览 92回答 2
2回答

白板的微信

您无法以二进制IEEE 754格式精确表示 0.1,这是大多数现代架构在内部使用的表示浮点数的格式。最接近 0.1 的二进制值仅比真实值稍差一些。当您将这个最接近的近似值添加五次时,误差将会增加。根据文档np.arange:当使用非整数步长(例如 0.1)时,结果通常会不一致。最好用于numpy.linspace这些情况。原因是通过夹紧两端,linapace可以对累积误差做出一些保证,而这是arange不能保证的。使用的每个单独的步长可能不是最接近的 0.1 二进制表示,但每个元素从开始到结束linspace都会尽可能接近。n * 0.1linapace对应的调用np.arange(0.5, 1.1, 0.1)是np.linspace(0.5, 1.0, 6)另一个优点linspace是你可以固定点数。另外根据arange文档(返回值):对于浮点参数,结果的长度为ceil((stop - start)/step)。由于浮点溢出,此规则可能会导致out的最后一个元素大于stop。

胡说叔叔

作为替代方案,您可以利用除法不会产生与迭代加法一样多的错误这一事实。这是浮点运算所能得到的最精确的结果:np.arange(5, 11) / 10.0 # => array([0.5, 0.6, 0.7, 0.8, 0.9, 1. ])(np.linspace使用非常相似的公式,但只要您使用有理数,上面的代码在您的用例中可能更容易理解 - 您不必自己计算步数。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python