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
讓我知道是否有幫助。

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

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
,這足以存儲您需要的精度。
添加回答
舉報