Должен быть простой вопрос, но я не могу найти ответ нигде. Оператор ~
в python документируется как побитовый оператор инверсии. Хорошо. Я заметил, по-видимому, шизофреническое поведение, хотя и остроумие:
~True -> -2
~1 -> -2
~False -> -1
~0 -> -1
~numpy.array([True,False],dtype=int) -> array([-2,-1])
~numpy.array([True,False],dtype=bool) -> array([False,True])
В первых 4 примерах я вижу, что python реализует (как документировано) ~x = -(x+1)
, причем вход обрабатывается как int, даже если он булеван. Следовательно, для скалярного булева ~
не рассматривается как логическое отрицание. Не то, чтобы поведение было одинаковым в массиве numpy, определенном с булевыми значениями, с помощью типа int.
Почему ~
затем работает как логический оператор отрицания в булевом массиве (также обратите внимание: ~numpy.isfinite(numpy.inf) -> True
?)?
Очень обидно, что я должен использовать not()
на скаляре, но not()
не будет работать, чтобы свести на нет массив. Тогда для массива я должен использовать ~
, но ~
не будет работать, чтобы свести на нет скаляр...