我有些困惑Python/NumPy在类型转换无符号整数时的工作方式。
例子:
import numpy as np
x = np.array([255], dtype=np.uint8)
y = x + 1
这将得到结果:
In[0]: y
Out[0]: array([0], dtype=uint8)
我了解uint8无法存储大于255的整数,因此会循环回零。我有点预料到这一点。
现在我尝试:
z = x + 256
这意味着:
In[1]: z
Out[1]: array([511], dtype=uint16)
在这种情况下,类型已更改为具有更多字节以容纳更大数字的类型,但仅当要添加的整数本身不适合较小的类型时才会发生。 (有趣的是,x + 255不会产生uint16结果)
这让我感到有些奇怪。 这背后是否有任何逻辑? 我认为一个更一致的做法是在第一个示例案例中也将类型更改为uint16。
type(np.uint8(511) + 1)
打印出<type 'numpy.int64'>
。它几乎肯定对操作数进行了某种类型强制转换,但我还没有在源代码中找到确切的逻辑。testing/print_coercion_tables.py
中有一个脚本可能会引起兴趣。 - Aya