使用np.uint8进行Python错误计算

2024-09-16 03:16:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在Jupyter笔记本上做计算的时候。我尝试使用**np.power将数组提升到2的级别。两者都会产生错误的结果

enter image description here

有什么问题吗? 如果我在一个数字上运行,计算是正确的


Tags: 错误np笔记本jupyter数字数组级别power
3条回答

数组的类型为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

一点背景知识

当你说:

If i run on a single number- calculation is correct

您可能的意思是,您正在使用python内置的int类型。Python中的int是任意精度的,这意味着将分配尽可能多的存储字节,以便保存数据项而不会溢出

当您使用NumPy数组时,情况并非如此,因为它们是作为存储在内存中相邻且有规则间隔的值序列实现的,您无法使其中一个值需要更多的字节,因为它没有“增长”的空间。因此,每个NumPy数组都有一个关联的数据类型,在创建数组时使用该数据类型,并且其中的所有值都有此数据类型

使用NumPy数组执行操作时,输出数据类型的长度基于输入中的数据类型。因为您的数组image是数据类型np.uint8,(并且2是一个可以存储在np.uint8中的值),所以操作image ** 2的结果也是数据类型np.uint8,因此值会溢出,因为它们超过了2^8

如果您这样做:

image.astype(np.uint16) ** 2

这将使用数据类型为np.uint16的输入数据的临时副本进行操作,因此输出数据类型为np.uint16,这将足以存储所需的精度

这是因为数组的数据类型是uint8,它只能存储8位数字,即0-255。在这之后,溢出发生,结果被包装起来,它将x mod 256作为x的表示。例如,62*62=3844但由于3844不能容纳在8位中,因此得到的结果是3844 mod 256。因此,为了得到正确的结果,您需要将数据类型更改为较长的数据类型,例如int。试试这个:

image.astype(np.int)**2

如果有帮助,请告诉我

相关问题 更多 >