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

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

使用 np.uint8 的 Python 錯誤計算

使用 np.uint8 的 Python 錯誤計算

茅侃侃 2023-02-15 17:18:44
嘗試在 Jupyter 筆記本中進行一些計算時。2我嘗試使用**或使用來提高數組的 次方np.power。兩者都會產生錯誤的結果??赡苁鞘裁磫栴}?如果我運行一個數字,計算是正確的。
查看完整描述

3 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

這是因為您的數組的數據類型uint8只能存儲 8 位數字,即 0-255。在那之后,溢出發生并且你的結果被包裹起來,這讓你成為x mod 256的代表x。例如,62*62=3844由于 3844 不能容納在 8 位中,因此您得到的結果是 4,即3844 mod 256. 因此,為了獲得正確的結果,您需要將數據類型更改為更長的類型,例如int. 嘗試這個:

image.astype(np.int)**2

讓我知道是否有幫助。


查看完整回答
反對 回復 2023-02-15
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

您的數組是 uint-8 類型,它是一個 8 位整數。計算沒問題——你看到的是溢出。


例如:


np.uint8(20) * np.uint8(20) 

輸出:


/usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:1: RuntimeWarning:


overflow encountered in ubyte_scalars


144


查看完整回答
反對 回復 2023-02-15
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

一點背景。

當你說:

如果我運行一個數字 - 計算是正確的

您可能的意思是您正在使用 python 內置int類型。Pythonint中的 是任意精度,這意味著將分配盡可能多的存儲字節以保存數據項而不會溢出。

當您使用 NumPy 數組時,情況并非如此,因為它們被實現為一系列值,這些值在內存中相鄰存儲并定期間隔 - 您無法使其中一個值需要更多字節,因為它無處可去“生長”。所以每個 NumPy 數組都有一個關聯的數據類型,該數據類型在創建數組時使用,并且其中的所有值都具有此數據類型。

使用 NumPy 數組執行操作時,輸出數據類型的長度基于輸入中的數據類型。因為你的數組image是 datatype np.uint8,(并且2是一個可以存儲在 a 中的值np.uint8),所以操作的結果image ** 2也是 datatype np.uint8,所以值溢出,因為它們超過了 2^8。

如果你這樣做:

image.astype(np.uint16) ** 2

這將使用 datatype 的輸入數據的臨時副本進行操作np.uint16,因此輸出將是 datatype np.uint16,這足以存儲您需要的精度。


查看完整回答
反對 回復 2023-02-15
  • 3 回答
  • 0 關注
  • 760 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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