为了账号安全,请及时绑定邮箱和手机立即绑定

使用 np.uint8 的 Python 错误计算

使用 np.uint8 的 Python 错误计算

茅侃侃 2023-02-15 17:18:44
尝试在 Jupyter 笔记本中进行一些计算时。2我尝试使用**或使用来提高数组的 次方np.power。两者都会产生错误的结果。可能是什么问题?如果我运行一个数字,计算是正确的。
查看完整描述

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

让我知道是否有帮助。


查看完整回答
反对 回复 2023-02-15
?
叮当猫咪

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


查看完整回答
反对 回复 2023-02-15
?
一只斗牛犬

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,这足以存储您需要的精度。


查看完整回答
反对 回复 2023-02-15
  • 3 回答
  • 0 关注
  • 382 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信