在计算布尔的倒数系列之和时,为什么需要括号或新变量?

时间:2018-11-21 20:28:04

标签: python pandas numpy

提供一些数据:

>> s = pd.Series([True, False, True, False, True])

>> ~s.values == (~s).values
array([True,  True, True,  True, True])

但是

>> ~s.values.sum()
-4 
>> (~s).values.sum()
2

>> x = ~s.values
>> x.sum() == (~s).values.sum()
True

为什么我们需要使用括号(~s).values或将~s.values存储在新变量中,以便~Series.sum()在{{ 1}}?


这是由于优先级所致,如@ juanpa.arrivillaga和@cwallenpoole所述。确实:

False

3 个答案:

答案 0 :(得分:4)

因为属性访问的precedence高于~运算符的优先级。因此,求和之前必须先求和。

许多numpy / pandas对象会覆盖按位运算符,以进行矢量化计算。不幸的是,这将导致它们表现异常。

换句话说,它被评估为:

~((s.values).sum())

答案 1 :(得分:0)

这与评估顺序(或precedence)有关。 ~使表达式向右反转。

答案 2 :(得分:0)

在不带括号的情况下,首先使用原始值调用sum()。然后将sum()的结果取反。使用(〜values.sum),这些值首先被取反,然后使用取反后的列表对sum()进行计算。