Зачем нам нужны круглые скобки или новая переменная при расчете суммы инвертированных рядов логических значений? - PullRequest
0 голосов
/ 21 ноября 2018

Учитывая некоторые данные:

>> 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() дал нам правильное количество False значений в s?


Это из-за приоритета, как указано@ juanpa.arrivillaga и @cwallenpoole.Действительно:

>> ~3 is -4
True

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Это связано с порядком оценки (или приоритет ).~ производит инверсию выражения вправо.

0 голосов
/ 21 ноября 2018

Без скобок первая сумма () вызывается с исходными значениями.Результат sum () затем инвертируется.При (~ values) .sum значения сначала инвертируются, а затем sum () вызывается с инвертированным списком.

0 голосов
/ 21 ноября 2018

Поскольку приоритет доступа к атрибуту выше, чем приоритет оператора ~.Таким образом, оно суммируется до того, как оно отменяется.

Многие объекты numpy / pandas переопределяют побитовые операторы для векторизованных вычислений.К сожалению, это заставит их вести себя неожиданно.

Другими словами, его оценивают как:

~((s.values).sum())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...