3 回答
TA貢獻1821條經(jīng)驗 獲得超5個贊
這是因為您的數(shù)組的數(shù)據(jù)類型uint8只能存儲 8 位數(shù)字,即 0-255。在那之后,溢出發(fā)生并且你的結(jié)果被包裹起來,這讓你成為x mod 256的代表x。例如,62*62=3844由于 3844 不能容納在 8 位中,因此您得到的結(jié)果是 4,即3844 mod 256. 因此,為了獲得正確的結(jié)果,您需要將數(shù)據(jù)類型更改為更長的類型,例如int. 嘗試這個:
image.astype(np.int)**2
讓我知道是否有幫助。
TA貢獻1776條經(jīng)驗 獲得超12個贊
您的數(shù)組是 uint-8 類型,它是一個 8 位整數(shù)。計算沒問題——你看到的是溢出。
例如:
np.uint8(20) * np.uint8(20)
輸出:
/usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:1: RuntimeWarning:
overflow encountered in ubyte_scalars
144
TA貢獻1784條經(jīng)驗 獲得超2個贊
一點背景。
當你說:
如果我運行一個數(shù)字 - 計算是正確的
您可能的意思是您正在使用 python 內(nèi)置int類型。Pythonint中的 是任意精度,這意味著將分配盡可能多的存儲字節(jié)以保存數(shù)據(jù)項而不會溢出。
當您使用 NumPy 數(shù)組時,情況并非如此,因為它們被實現(xiàn)為一系列值,這些值在內(nèi)存中相鄰存儲并定期間隔 - 您無法使其中一個值需要更多字節(jié),因為它無處可去“生長”。所以每個 NumPy 數(shù)組都有一個關(guān)聯(lián)的數(shù)據(jù)類型,該數(shù)據(jù)類型在創(chuàng)建數(shù)組時使用,并且其中的所有值都具有此數(shù)據(jù)類型。
使用 NumPy 數(shù)組執(zhí)行操作時,輸出數(shù)據(jù)類型的長度基于輸入中的數(shù)據(jù)類型。因為你的數(shù)組image是 datatype np.uint8,(并且2是一個可以存儲在 a 中的值np.uint8),所以操作的結(jié)果image ** 2也是 datatype np.uint8,所以值溢出,因為它們超過了 2^8。
如果你這樣做:
image.astype(np.uint16) ** 2
這將使用 datatype 的輸入數(shù)據(jù)的臨時副本進行操作np.uint16,因此輸出將是 datatype np.uint16,這足以存儲您需要的精度。
添加回答
舉報
