Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python计算错误(奇怪!!)_Python_Numpy_Jupyter Notebook - Fatal编程技术网

python计算错误(奇怪!!)

python计算错误(奇怪!!),python,numpy,jupyter-notebook,Python,Numpy,Jupyter Notebook,当我试图在jupyter笔记本中进行一些计算时,我试图通过**或使用np.power将数组的幂提高到2,这两种方法都会给我带来糟糕的结果,正如您在所附图片中看到的,可能会出现什么问题? 如果我在一个数字上运行-计算是正确的,但任何其他数组都是错误的。 您的数组是uint-8类型,它是一个8位整数。计算很好-你看到的是溢出 例如: np.uint8(20) * np.uint8(20) 输出: /usr/local/lib/python3.7/site-packages/ipykernel_l

当我试图在jupyter笔记本中进行一些计算时,我试图通过**或使用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

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

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

image.astype(np.int)**2

如果有帮助,请告诉我。

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

image.astype(np.int)**2
如果有帮助,请告诉我。

一点背景知识

当你说:

如果我在一个数字上运行-计算是正确的

您可能的意思是,您正在使用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
,这将足以存储您需要的精度。

一点背景信息

当你说:

如果我在一个数字上运行-计算是正确的

您可能的意思是,您正在使用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
,这将足以存储您所需的精度。

使用更长的数据类型。请复制并粘贴文本,而不是上载屏幕截图。您的所有值都限制在一个字节内(dtype=uint8)。62**2如果尝试将其放在一个字节中,则变为4。请使用更长的数据类型。请复制并粘贴文本,而不是上载屏幕截图。您的所有值都限制在一个字节中(dtype=uint8)。62**2如果尝试将其放入一个字节,则变为4。