복붙노트

[PYTHON] 파이썬 틸드 단항 연산자 부정으로 numpy bool 배열

PYTHON

파이썬 틸드 단항 연산자 부정으로 numpy bool 배열

간단한 질문이어야하지만 어디서나 답을 찾을 수 없습니다. 파이썬에서 ~ 연산자는 비트 반전 연산자로 문서화되어 있습니다. 벌금. 나는 겉보기에 정신 분열증적인 행동을 주목했다.

~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 가지 예제에서 파이썬은 ~ x = - (x + 1)을 구현하고 있음을 알 수 있습니다. 입력 값은 부울 값이더라도 int로 처리됩니다. 따라서 스칼라 부울의 경우 ~는 논리적 부정으로 처리되지 않습니다. 그 동작이 int 타입으로 부울 값으로 정의 된 질의없는 배열에서 동일하지는 않습니다.

왜 ~는 부울 배열에서 논리적 부정 연산자로 작동합니까? (또한주의 : ~ numpy.isfinite (numpy.inf) -> True?)?

스칼라에는 not ()를 써야한다는 것은 매우 짜증나지만, 배열을 무효화하지는 않습니다 (). 그럼 배열을 위해, 나는 ~을 사용해야 만합니다. 그러나 ~는 스칼라를 무효화하지 않습니다 ...

해결법

  1. ==============================

    1.not는 True 또는 False를 반환해야하는 __nonzero__ 특수 메서드를 통해 구현되므로 필요한 결과를 제공 할 수 없습니다. 대신 ~ 연산자가 사용되며 __not__ 특수 메서드를 통해 구현됩니다. 같은 이유로, &와 | and와 or 대신에 사용된다.

    not는 True 또는 False를 반환해야하는 __nonzero__ 특수 메서드를 통해 구현되므로 필요한 결과를 제공 할 수 없습니다. 대신 ~ 연산자가 사용되며 __not__ 특수 메서드를 통해 구현됩니다. 같은 이유로, &와 | and와 or 대신에 사용된다.

    불리언 연산자의 오버로딩을 목표로하지만 과도한 오버 헤드로 인해 거부 된 PEP 335 (예 : if 문이 복잡함). PEP 225는 "요소 별"연산자에 대한 일반적인 구문을 제안합니다. 이는보다 일반적인 솔루션을 제공하지만 지연되었습니다. 현재의 상황은 어색하지만 변경을 강요하기에는 고통스럽지 않다.

    np.isfinite가 스칼라에서 호출되면 bool이 아닌 np.bool_ 유형의 값을 반환합니다. np.bool_은 bool dtype의 배열에서 스칼라 값을 추출 할 때 얻는 타입이기도합니다. True와 False 대신 np.True_와 np.False_를 사용하면 ~에서 일관된 동작을 얻을 수 있습니다.

  2. from https://stackoverflow.com/questions/13600988/python-tilde-unary-operator-as-negation-numpy-bool-array by cc-by-sa and MIT license