久久精品国产强奸|亚洲久久视频日韩|久草在想AV22|av72麻豆花絮|精品九九强奸视频|国产亚洲三级影片|香蕉啊啊一区二区|丁香五月在线观看|就1n7在线超碰|91中文在线资源

NumPy vectorize 導致數值“舍入”為最接近的整數:原因及解決方案

碧海醫(yī)心
發(fā)布: 2025-08-03 17:04:19
原創(chuàng)
195人瀏覽過

numpy vectorize 導致數值“舍入”為最接近的整數:原因及解決方案

第一段引用上面的摘要:

本文探討了在使用 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))
登錄后復制

解決方案

以下提供兩種解決方案,避免數據類型溢出,確保計算結果的準確性。

1. 使用浮點數

最直接的解決方法是將涉及指數運算的數值轉換為浮點數。這可以通過以下兩種方式實現:

  • 將常量 2 替換為 2.0。
  • 確保傳遞給函數的參數 n 是浮點數類型。

修改后的代碼如下:

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.,可以強制將指數運算的結果轉換為浮點數,從而避免溢出。

2. 避免使用 np.vectorize

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中文網其它相關文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數據和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網:公益在線php培訓,幫助PHP學習者快速成長!
關注服務號 技術交流群
PHP中文網訂閱號
每天精選資源文章推送
PHP中文網APP
隨時隨地碎片化學習
PHP中文網抖音號
發(fā)現有趣的

Copyright 2014-2025 http://www.400tele.com.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號