升级NumPy后np.int8转换150.0返回-106错误结果的原因求解
问题原因解释
核心原因:有符号整数溢出
你遇到的异常结果是np.int8的取值范围限制导致的整数溢出问题:
- 有符号8位整数
np.int8仅用8个比特存储数值,最高位为符号位,合法取值范围为 -128 ~ 127(即-2^7到2^7 - 1) np.int16的取值范围为-32768 ~ 32767,np.int32的取值范围为-2147483648 ~ 2147483647,二者的最大值都远大于150,因此转换结果正常。
150转int8得到-106的计算逻辑
数值150的8位二进制表示为10010110,对于有符号int8来说,最高位为1代表这是一个负数,负数在计算机中以补码形式存储:
- 对补码
10010110按位取反得到反码:01101001 - 反码加1得到原码:
01101010,对应的十进制值为106 - 加上符号位的负号,最终结果就是
-106,和你测试得到的结果完全一致。
场景适配建议
你提到多数存储0/1的数组用np.int8完全没问题,只要注意两个点即可:
- 业务逻辑中如果存在中间计算步骤,不要直接用
np.int8存储中间结果,避免中间值超出范围溢出,可先用np.int16/np.int32完成计算后再转np.int8存储最终结果 - 确认所有需要存储的数值都落在
-128 ~ 127范围内,再使用np.int8类型
另外你提到的np.int弃用警告是正常现象:NumPy从1.20版本开始弃用np.int、np.float这种和Python原生类型绑定的别名,推荐明确指定位宽的写法,你主动切换到明确位宽整数类型的思路是完全正确的。
内容的提问来源于stack exchange,提问作者dvulin
相关产品推荐
相关产品推荐

