假設我有兩個 2D numpy 陣列:x型別float64和mask型別bool。我想x只考慮掩碼定義的數字來找到每一列的變化。這是我所做的:
np.var(x, axis=0, where=mask)
不幸的是,它產生了錯誤:
FloatingPointError: overflow encountered in multiply
所以我想出了這個代碼:
x[~mask] = np.nan
np.nanvar(x, axis=0)
這作業正常。但是我想避免這種方法,因為它需要我對 nans 進行不必要的分配,這是浪費時間。我也想避免dtype像這樣明確指定
np.var(x, axis=0, where=mask, dtype=np.float128)
因為我認為溢位錯誤是我糟糕的代碼造成的np.float64,對于我的任務來說應該綽綽有余。所以請幫助我理解為什么看似相同的第一個和第二個片段會產生如此不同的結果。
編輯:這里要注意的重要一點是,我在 Jupyter notebook 中作業,并且該錯誤似乎只有在內核重新啟動后才能重現。出于某種原因,只需將單元運行兩次即可修復它。
uj5u.com熱心網友回復:
有一個中間計算numpy.var,它對 所有輸入值進行操作,即使是那些where為 False 的值。這可能會導致來自 的虛假警告numpy.var。請參閱我為此創建的numpy 問題。
nan基于您的解決方法很好。使用x[~mask] = 0然后numpy.var按原樣使用也可能就足夠了。
uj5u.com熱心網友回復:
您可以在不移動方差的情況下移動資料以避免溢位:
np.var(x - np.max(x), axis=0, where=mask)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/370338.html
