python - example - numpy where
operador unario de tilde pitón como negation numpy bool array (1)
not
se implementa mediante el método especial __nonzero__
, que se requiere para devolver True
o False
, por lo que no puede dar el resultado requerido. En su lugar, se usa el operador ~
, que se implementa a través del método especial __not__
. Por la misma razón, &
y |
se utilizan en lugar de and
y.
PEP 335 tenía como objetivo permitir la sobrecarga de operadores booleanos, pero fue rechazado debido a una sobrecarga excesiva (por ejemplo, complicaría las declaraciones). PEP 225 sugiere una sintaxis general para los operadores de "elemento", que proporcionaría una solución más general, pero se ha pospuesto. Parece que la situación actual, aunque incómoda, no es lo suficientemente dolorosa como para forzar el cambio.
np.isfinite
cuando se llama a un escalar devuelve un valor de tipo np.bool_
, no bool
. np.bool_
también es el tipo que obtienes al extraer un valor escalar de una matriz de bool dtype. Si usa np.True_
y np.False_
en lugar de True
y False
, obtendrá un comportamiento consistente bajo ~
.
Debería ser una pregunta simple, pero no puedo encontrar una respuesta en ningún lado. El operador ~
en python está documentado como operador de inversión bit a bit. Multa. Sin embargo, he notado un comportamiento aparentemente esquizofrénico, a saber:
~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])
En los primeros 4 ejemplos, puedo ver que python está implementando (como se documentó) ~x = -(x+1)
, con la entrada tratada como una int incluso si es booleana . Por lo tanto, para un booleano escalar, ~
no se trata como una negación lógica. No es que el comportamiento sea idéntico en una matriz numpy definida con valores booleanos por con un tipo int.
¿Por qué ~
funciona entonces como un operador de negación lógica en una matriz booleana (también aviso: ~numpy.isfinite(numpy.inf) -> True
?)?
Es extremadamente molesto que deba usar not()
en un escalar, pero not()
no funcionará para negar una matriz. Luego, para una matriz, debo usar ~
, pero ~
no funcionará para negar un escalar ...