这种行为似乎源于将数组转换保持在绝对最小值的可理解的愿望.
考虑
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%确定在查看所有数组元素之前这是必要的时候才会这样做,即仅当另一个操作数本身不适合当前类型时.事实上,即使我们采取
b = np.int16(1)
x+b
# array([0], dtype=uint8)
所以它实际上将右手操作数转换为较小的类型,所有这些都是为了保存数组的类型.另一方面,当添加两个np.array时,类型转换总是进行更大的类型.
长话短说: – 简单的整数加法总是强制转换为更大类型的操作数 – 如果这足以表示整数,则添加numpy数组和整数强制转换为数组的类型,否则为整数的类型 – 添加两个numpy数组转换为更大类型的操作数(与两个整数一样)