2010-08-06 51 views
7

me encontré con una línea de código usando numpy de Python que se veía así:¿Qué hace el operador unario en numpy?

~array([0,1,2,3,4,5,4,3,2,1,0,-1,-2]) 

y se la dio la salida:

array([-1, -2, -3, -4, -5, -6, -5, -4, -3, -2, -1, 0, 1]) 

¿El operador unario (~) tomar una matriz y aplicar una -> - (A + 1)

Si es así, ¿de qué sirve?

+2

Parece una negación a nivel de bit, como en C. El operador aplica a los enteros normales de Python (al menos para mí en 2.5. Tal vez debería actualizar ...) –

Respuesta

14

Chris Lutz' es correcta.

~ es el bitwise negation operator

Parece que resulta de A a - (A + 1), ya que en muchas computadoras modernas, los números negativos se representan como la Two's Complement del número entero positivo correspondiente, donde el número se resta de 2^(bit length) (eso es "dos con la potencia de la longitud de bit", no "dos exclusivos o longitud de bit" ...).

En un sistema de este tipo, -1 se representaría como todos. Por supuesto, por lo que sería la suma de un número y su negativa a nivel de bits, por lo que tenemos la situación en la que

a + ~a = -1  => 
    ~a = -1 - a => 
    ~a = -(a + 1) 

Como habrá notado.

0

El punto es ser capaz de tomar el complemento de los valles en una matriz. En el caso de numpy parece estar abreviatura de lo siguiente:

>>> map(lambda e: ~e, [0,1,2,3,4,5,4,3,2,1,0,-1,-2]) 
[-1, -2, -3, -4, -5, -6, -5, -4, -3, -2, -1, 0, 1] 
2

The ~ es el operador ones' complement y si se está usando con enteros que puede ser utilizado en cualquier programa de Python (que no es exclusivamente de numpy)

+0

No estoy tan seguro, la siguiente línea: ~ list [1,2,3] falla ya que el operador unario no se definió para listas, el objeto de clase tiene que tenerlas definidas como cualquier otro operador. – Hooked

+0

tienes razón, no lo he comprobado con listas –