第一段引用上面的摘要:
本文探討了在使用 NumPy 的 vectorize 函數時,可能出現的數值精度問題,即函數輸出結果非預期地變?yōu)?0 或 1。通過分析問題代碼,解釋了數據類型溢出是導致此現象的原因,并提供了兩種解決方案:將整數轉換為浮點數,以及避免使用 np.vectorize。同時,展示了優(yōu)化后的代碼示例,以避免潛在的精度損失,保證計算結果的準確性。
在使用 numpy.vectorize 時,如果輸出結果全部是 0 或 1,很可能是由于數據類型溢出導致的。具體來說,當計算結果超出 NumPy 數組所能表示的最大值時,就會發(fā)生溢出,導致結果不準確。
例如,在原始代碼中,2**n 這樣的表達式,當 n 足夠大時,其結果可能超過 int32 的表示范圍,導致溢出,從而影響后續(xù)計算。
import numpy as np def epsilon(n): return 1.6952445781450207*2**(-1.028148909051717*n) def pPsi(n): return 1.0577183294485202*2**(-1.028620169094481*n) def perrMaxFunc(n): res=epsilon(n)/(2*np.abs(1/2**n-pPsi(n))) return min([1,res]) vectorized_perr=np.vectorize(perrMaxFunc) nmax=500; perrMax=vectorized_perr([i for i in range(nmax)]) print(perrMax) print(perrMaxFunc(500))
以下提供兩種解決方案,避免數據類型溢出,確保計算結果的準確性。
最直接的解決方法是將涉及指數運算的數值轉換為浮點數。這可以通過以下兩種方式實現:
修改后的代碼如下:
import numpy as np def epsilon(n): return 1.6952445781450207*2.**(-1.028148909051717*n) def pPsi(n): return 1.0577183294485202*2.**(-1.028620169094481*n) def perrMaxFunc(n): res = epsilon(n)/(2.*np.abs(1/2.**n-pPsi(n))) return min([1,res]) vectorized_perr=np.vectorize(perrMaxFunc) nmax=500; perrMax=vectorized_perr([i for i in range(nmax)]) print(perrMax) print(perrMaxFunc(500))
通過將 2 替換為 2.,可以強制將指數運算的結果轉換為浮點數,從而避免溢出。
np.vectorize 本質上是一個循環(huán),效率并不高。NumPy 提供了許多向量化的函數,可以直接對數組進行操作,效率更高。例如,可以使用 np.minimum 代替 min 函數,并直接對 NumPy 數組進行操作。
修改后的代碼如下:
import numpy as np def epsilon(n): return 1.6952445781450207*2.**(-1.028148909051717*n) def pPsi(n): return 1.0577183294485202*2.**(-1.028620169094481*n) def perrMaxFunc(n): res = epsilon(n)/(2.*np.abs(1/2.**n-pPsi(n))) return np.minimum(1,res) nmax= 500 perrMax=perrMaxFunc(np.arange(nmax)) print(perrMax) print(perrMaxFunc(500))
在這個例子中,我們使用了 np.minimum 函數,它可以直接對數組進行操作,而不需要使用 np.vectorize。 此外,直接對 np.arange(nmax) 生成的數組進行操作,也避免了使用列表推導式,提高了代碼效率。
在使用 NumPy 進行數值計算時,需要注意數據類型溢出的問題。通過將整數轉換為浮點數,或者避免使用 np.vectorize,可以直接對 NumPy 數組進行操作,可以有效避免溢出問題,并提高代碼效率。同時,建議盡可能使用 NumPy 提供的向量化函數,以充分利用 NumPy 的性能優(yōu)勢。
以上就是NumPy vectorize 導致數值“舍入”為最接近的整數:原因及解決方案的詳細內容,更多請關注php中文網其它相關文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數據和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
Copyright 2014-2025 http://www.400tele.com.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號