2024-09-16 03:16:57 发布
网友
在Jupyter笔记本上做计算的时候。我尝试使用**或np.power将数组提升到2的级别。两者都会产生错误的结果
**
np.power
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_scalars 144
一点背景知识
当你说:
If i run on a single number- calculation is correct
您可能的意思是,您正在使用python内置的int类型。Python中的int是任意精度的,这意味着将分配尽可能多的存储字节,以便保存数据项而不会溢出
int
当您使用NumPy数组时,情况并非如此,因为它们是作为存储在内存中相邻且有规则间隔的值序列实现的,您无法使其中一个值需要更多的字节,因为它没有“增长”的空间。因此,每个NumPy数组都有一个关联的数据类型,在创建数组时使用该数据类型,并且其中的所有值都有此数据类型
使用NumPy数组执行操作时,输出数据类型的长度基于输入中的数据类型。因为您的数组image是数据类型np.uint8,(并且2是一个可以存储在np.uint8中的值),所以操作image ** 2的结果也是数据类型np.uint8,因此值会溢出,因为它们超过了2^8
image
np.uint8
image ** 2
如果您这样做:
image.astype(np.uint16) ** 2
这将使用数据类型为np.uint16的输入数据的临时副本进行操作,因此输出数据类型为np.uint16,这将足以存储所需的精度
np.uint16
这是因为数组的数据类型是uint8,它只能存储8位数字,即0-255。在这之后,溢出发生,结果被包装起来,它将x mod 256作为x的表示。例如,62*62=3844但由于3844不能容纳在8位中,因此得到的结果是3844 mod 256。因此,为了得到正确的结果,您需要将数据类型更改为较长的数据类型,例如int。试试这个:
uint8
x mod 256
x
62*62=3844
3844 mod 256
image.astype(np.int)**2
如果有帮助,请告诉我
数组的类型为uint-8,它是一个8位整数。计算很好-你看到的是溢出
例如:
输出:
一点背景知识
当你说:
您可能的意思是,您正在使用python内置的
int
类型。Python中的int
是任意精度的,这意味着将分配尽可能多的存储字节,以便保存数据项而不会溢出当您使用NumPy数组时,情况并非如此,因为它们是作为存储在内存中相邻且有规则间隔的值序列实现的,您无法使其中一个值需要更多的字节,因为它没有“增长”的空间。因此,每个NumPy数组都有一个关联的数据类型,在创建数组时使用该数据类型,并且其中的所有值都有此数据类型
使用NumPy数组执行操作时,输出数据类型的长度基于输入中的数据类型。因为您的数组
image
是数据类型np.uint8
,(并且2
是一个可以存储在np.uint8
中的值),所以操作image ** 2
的结果也是数据类型np.uint8
,因此值会溢出,因为它们超过了2^8如果您这样做:
这将使用数据类型为
np.uint16
的输入数据的临时副本进行操作,因此输出数据类型为np.uint16
,这将足以存储所需的精度这是因为数组的数据类型是
uint8
,它只能存储8位数字,即0-255。在这之后,溢出发生,结果被包装起来,它将x mod 256
作为x
的表示。例如,62*62=3844
但由于3844不能容纳在8位中,因此得到的结果是3844 mod 256
。因此,为了得到正确的结果,您需要将数据类型更改为较长的数据类型,例如int
。试试这个:如果有帮助,请告诉我
相关问题 更多 >
编程相关推荐