为什么Numpy布尔数组执行~b.sum()运算会得到负数结果?
问题底层原因说明
出现该差异的核心原因是运算符优先级不同,具体逻辑拆解如下:
- 首先Python语法中,方法调用(即
.sum()这类语法)的优先级远高于一元按位非运算符~,因此~b.sum()的执行顺序和你预期的完全不同:- 第一步优先执行
b.sum(),布尔数组求和得到整数结果1 - 第二步才对整数
1执行按位非运算~1,而非你预期的“先对数组做按位非再求和”
- 第一步优先执行
- 整数的按位非运算规则:Python的整数采用补码方式存储,按位非
~会对整数的所有二进制位取反,对应的数学计算规则为~x = -x -1
代入第一步得到的结果x=1,可得~1 = -1 -1 = -2,和你得到的运行结果完全一致
对比验证
你预期的运算逻辑需要手动加括号改变运算优先级,对应代码为(~b).sum(),才能先对数组做按位非得到3个True,再求和得到结果3。
# 无括号的实际执行逻辑等价代码 step1 = b.sum() # 返回整数 1 step2 = ~step1 # 返回整数 -2 print(step2 == ~b.sum()) # 输出 True # 符合你预期的逻辑需要手动加括号 print((~b).sum()) # 输出 3
内容的提问来源于stack exchange,提问作者Wesley Kitlasten
相关产品推荐
相关产品推荐

