3 回答
TA贡献1821条经验 获得超4个赞
这是因为您的数组的数据类型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
,这足以存储您需要的精度。
添加回答
举报