Должен быть простой вопрос, но я не могу найти ответ нигде. Оператор ~ в 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() не будет работать, чтобы свести на нет массив. Тогда для массива я должен использовать ~, но ~ не будет работать, чтобы свести на нет скаляр...