擅长:python、mysql、java
<p>一点背景知识</p>
<p>当你说:</p>
<blockquote>
<p>If i run on a single number- calculation is correct</p>
</blockquote>
<p>您可能的意思是,您正在使用python内置的<code>int</code>类型。Python中的<code>int</code>是任意精度的,这意味着将分配尽可能多的存储字节,以便保存数据项而不会溢出</p>
<p>当您使用NumPy数组时,情况并非如此,因为它们是作为存储在内存中相邻且有规则间隔的值序列实现的,您无法使其中一个值需要更多的字节,因为它没有“增长”的空间。因此,每个NumPy数组都有一个关联的数据类型,在创建数组时使用该数据类型,并且其中的所有值都有此数据类型</p>
<p>使用NumPy数组执行操作时,输出数据类型的长度基于输入中的数据类型。因为您的数组<code>image</code>是数据类型<code>np.uint8</code>,(并且<code>2</code>是一个可以存储在<code>np.uint8</code>中的值),所以操作<code>image ** 2</code>的结果也是数据类型<code>np.uint8</code>,因此值会溢出,因为它们超过了2^8</p>
<p>如果您这样做:</p>
<pre><code>image.astype(np.uint16) ** 2
</code></pre>
<p>这将使用数据类型为<code>np.uint16</code>的输入数据的临时副本进行操作,因此输出数据类型为<code>np.uint16</code>,这将足以存储所需的精度</p>