为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2023-10-06 18:52:32
对于下面的代码,我希望范围停止在值 1.0,但它一直上升到 1.099999...,这是有道理的,因为它是一个浮点值。创建步长为 0.1 的范围的更好方法是什么?import numpy as npstart = 0.5stop = 1.0step = 0.1for parameter_value in np.arange(start, stop + step, step):  print(parameter_value)输出0.50.60.70.79999999999999990.89999999999999990.99999999999999991.0999999999999999
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您无法以二进制IEEE 754格式精确表示 0.1,这是大多数现代架构在内部使用的表示浮点数的格式。

最接近 0.1 的二进制值仅比真实值稍差一些。当您将这个最接近的近似值添加五次时,误差将会增加。

根据文档np.arange

当使用非整数步长(例如 0.1)时,结果通常会不一致。最好用于numpy.linspace这些情况。

原因是通过夹紧两端,linapace可以对累积误差做出一些保证,而这是arange不能保证的。使用的每个单独的步长可能不是最接近的 0.1 二进制表示,但每个元素从开始到结束linspace都会尽可能接近。n * 0.1

linapace对应的调用np.arange(0.5, 1.1, 0.1)

np.linspace(0.5, 1.0, 6)

另一个优点linspace是你可以固定点数。另外根据arange文档(返回值):

对于浮点参数,结果的长度为ceil((stop - start)/step)。由于浮点溢出,此规则可能会导致out的最后一个元素大于stop


查看完整回答
反对 回复 2023-10-06
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

作为替代方案,您可以利用除法不会产生与迭代加法一样多的错误这一事实。这是浮点运算所能得到的最精确的结果:

np.arange(5, 11) / 10.0
# => array([0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

np.linspace使用非常相似的公式,但只要您使用有理数,上面的代码在您的用例中可能更容易理解 - 您不必自己计算步数。)


查看完整回答
反对 回复 2023-10-06
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信