在对无符号整数进行类型转换时,我对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。
答案 0 :(得分:3)
这种行为似乎源于将数组转换保持在绝对最小值的可理解的愿望。
考虑
z = np.uint8(255)
z + 1
# 256
type(z+1)
# numpy.int64
文字1
的类型为int
。在这种情况下,似乎两个操作数都被强制转换为np.int64。但这与结果无关!
zz = np.uint8(1)
type(zz + 1)
# numpy.int64
如果我们使用数组而不是简单整数,则转换是不同的。
x = np.array([255], dtype=np.uint8)
x + 1
# array([0], dtype=uint8)
对我来说这可能就是这种情况,因为将整个数组从一种类型转换为另一种类型需要大量的计算工作,所以只有在100%确定这将是必要的之前才会这样做。 / strong>查看所有数组元素,即仅当另一个操作数本身不适合当前类型时。事实上,即使我们采取
b = np.int16(1)
x+b
# array([0], dtype=uint8)
所以它实际上将右手操作数转换为较小的类型,所有这些都是为了保存数组的类型。另一方面,当添加两个np.array时,类型转换总是进行更大的类型。
长话短说: - 简单的整数加法总是强制转换为更大类型的操作数 - 如果这足以表示整数,则添加numpy数组和整数强制转换为数组的类型,否则为整数的类型 - 添加两个numpy数组转换为更大类型的操作数(与两个整数一样)