使用 np.uint8 的 Python 错误计算

尝试在 Jupyter 笔记本中进行一些计算时。2我尝试使用**或使用来提高数组的 次方np.power。两者都会产生错误的结果。

http://img4.mukewang.com/63eca3ad0001631a05470451.jpg

可能是什么问题?如果我运行一个数字,计算是正确的。



茅侃侃
浏览 927回答 3
3回答

收到一只叮咚

这是因为您的数组的数据类型uint8只能存储 8 位数字,即 0-255。在那之后,溢出发生并且你的结果被包裹起来,这让你成为x mod 256的代表x。例如,62*62=3844由于 3844 不能容纳在 8 位中,因此您得到的结果是 4,即3844 mod 256. 因此,为了获得正确的结果,您需要将数据类型更改为更长的类型,例如int. 尝试这个:image.astype(np.int)**2让我知道是否有帮助。

叮当猫咪

您的数组是 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_scalars144

一只斗牛犬

一点背景。当你说:如果我运行一个数字 - 计算是正确的您可能的意思是您正在使用 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,这足以存储您需要的精度。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python