亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有比 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 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號