numpy中np.uint数据类型执行加法时出现意外隐式转换为float问题
原因说明
该现象由numpy的类型提升规则和np.uint的平台特性共同导致:
np.uint是平台相关的无符号整数别名,多数环境下默认对应np.uint32,你可以执行print(np.dtype(np.uint))查看当前环境的实际位宽。- 当numpy标量和Python原生整数运算时,numpy会自动选择能同时容纳两种类型所有可能取值的最小类型作为结果类型。如果你的环境中
np.uint是32位无符号整数,取值范围为0 ~ 4294967295,而Python原生的1会被numpy识别为有符号整数,32位有符号整数的最大取值仅为2147483647,无法覆盖np.uint32的全部取值范围,不存在符合要求的整数类型,因此numpy只能将结果向上提升为float64类型,最终返回2.0。
int/np.int64无该问题的原因
使用有符号整数类型(如np.int64、Python原生int)运算时,双方均为有符号类型,存在可以覆盖两者取值范围的整数类型,运算后结果依然为整数类型,不会触发向浮点型的转换。
规避方案
如果要避免隐式转换为浮点型,可采用两种处理方式:
- 使用和数组同类型的标量参与运算:
a[0] + np.uint(1) # 返回uint类型的2,不会转浮点
- 明确指定无符号整数的位宽,只要位宽低于系统默认有符号整数位宽就不会触发转换,比如32位系统下使用
np.uint16,64位系统下使用np.uint32。
内容的提问来源于stack exchange,提问作者kstn
相关产品推荐
相关产品推荐

