3 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是因?yàn)槟臄?shù)組的數(shù)據(jù)類型uint8
只能存儲(chǔ) 8 位數(shù)字,即 0-255。在那之后,溢出發(fā)生并且你的結(jié)果被包裹起來(lái),這讓你成為x mod 256
的代表x
。例如,62*62=3844
由于 3844 不能容納在 8 位中,因此您得到的結(jié)果是 4,即3844 mod 256
. 因此,為了獲得正確的結(jié)果,您需要將數(shù)據(jù)類型更改為更長(zhǎng)的類型,例如int
. 嘗試這個(gè):
image.astype(np.int)**2
讓我知道是否有幫助。

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
您的數(shù)組是 uint-8 類型,它是一個(gè) 8 位整數(shù)。計(jì)算沒(méi)問(wèn)題——你看到的是溢出。
例如:
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貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
一點(diǎn)背景。
當(dāng)你說(shuō):
如果我運(yùn)行一個(gè)數(shù)字 - 計(jì)算是正確的
您可能的意思是您正在使用 python 內(nèi)置int
類型。Pythonint
中的 是任意精度,這意味著將分配盡可能多的存儲(chǔ)字節(jié)以保存數(shù)據(jù)項(xiàng)而不會(huì)溢出。
當(dāng)您使用 NumPy 數(shù)組時(shí),情況并非如此,因?yàn)樗鼈儽粚?shí)現(xiàn)為一系列值,這些值在內(nèi)存中相鄰存儲(chǔ)并定期間隔 - 您無(wú)法使其中一個(gè)值需要更多字節(jié),因?yàn)樗鼰o(wú)處可去“生長(zhǎng)”。所以每個(gè) NumPy 數(shù)組都有一個(gè)關(guān)聯(lián)的數(shù)據(jù)類型,該數(shù)據(jù)類型在創(chuàng)建數(shù)組時(shí)使用,并且其中的所有值都具有此數(shù)據(jù)類型。
使用 NumPy 數(shù)組執(zhí)行操作時(shí),輸出數(shù)據(jù)類型的長(zhǎng)度基于輸入中的數(shù)據(jù)類型。因?yàn)槟愕臄?shù)組image
是 datatype np.uint8
,(并且2
是一個(gè)可以存儲(chǔ)在 a 中的值np.uint8
),所以操作的結(jié)果image ** 2
也是 datatype np.uint8
,所以值溢出,因?yàn)樗鼈兂^(guò)了 2^8。
如果你這樣做:
image.astype(np.uint16) ** 2
這將使用 datatype 的輸入數(shù)據(jù)的臨時(shí)副本進(jìn)行操作np.uint16
,因此輸出將是 datatype np.uint16
,這足以存儲(chǔ)您需要的精度。
添加回答
舉報(bào)