2012-11-28 12 views
25

Powinien być prostym pytaniem, ale nie jestem w stanie znaleźć nigdzie odpowiedzi. Operator ~ w Pythonie jest udokumentowanym operatorem odwracania bitowego. W porządku. Zauważyłem pozornie schizofreniczne zachowania choć słownie:python tyldowy operator unarny jako negacja numpy bool array

~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]) 

W pierwszych 4 przykładach, widzę, że Python jest wdrożenie (udokumentowane) ~x = -(x+1), z wejściem traktowanej jako int nawet jeśli jest to logiczna . W związku z tym, dla skalarnej wartości boolowskiej, ~ nie jest traktowane jako logiczna negacja. Nie oznacza to, że zachowanie jest identyczne w tablicy typu numpy zdefiniowanej wartościami logicznymi za pomocą typu int.

Dlaczego następnie ~ działa jako logiczny operator negacji w tablicy boolowskiej (Zwróć też uwagę: ~numpy.isfinite(numpy.inf) -> True?)?

To jest bardzo denerwujące, że muszę używać not() na skalar, ale not() nie będzie działać, aby zanegować tablicę. Następnie na tablicy, muszę używać ~, ale ~ nie będzie działać do zanegowania skalar ...

Odpowiedz

26

not jest realizowany przez __nonzero__ specjalnej metody, która jest wymagana, aby powrócić albo True lub False, więc może” t podać wymagany wynik. Zamiast tego używany jest operator ~, który jest implementowany specjalną metodą __not__. Z tego samego powodu, & i | są używane zamiast and i or.

PEP 335 mające na celu umożliwienie przeciążenia operatorów boolowskich, ale zostało odrzucone z powodu nadmiernego narzutu (np. Komplikowanie instrukcji if). PEP 225 sugeruje ogólną składnię operatorów "elementwise", która zapewnia bardziej ogólne rozwiązanie, ale została odroczona. Wydaje się, że obecna sytuacja, choć niezręczna, nie jest wystarczająco bolesna, aby wymusić zmianę.

np.isfinite po wywołaniu skalarnym zwraca wartość typu np.bool_, a nie bool. np.bool_ to także typ, jaki uzyskuje się przy wyodrębnianiu wartości skalarnej z tablicy typu bool dtype. Jeśli użyjesz np.True_ i np.False_ zamiast True i False, uzyskasz spójne zachowanie pod numerem ~.

+0

Dzięki ecatmur za wyjaśnienie, a zwłaszcza za wspomnienie '&' i '|'. Nie wiedziałem o tym i użyłem zamiast tego logicznego_i logicznego_orazu. –

+0

Używam 'numpy' od wieków i do tej pory nie znałem celu tych pozornie przedefiniowanych-ale-podkreślonych konstrukcji, takich jak' np.False_'. To wszystko ma teraz sens – dashesy