2010-08-06 8 views
7

je suis tombé sur une ligne de code à l'aide de numpy de Python qui ressemblait à ceci:Qu'est-ce que l'opérateur unaire ~ fait en numpy?

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

Et il a donné la sortie:

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

L'opérateur unaire (~) prendre un tableau et appliquer une -> - (A + 1)

Si oui, quel est le point?

+2

Il semble être une négation au niveau des bits, tout comme c'est le cas en C. L'opérateur s'applique aux entiers Python normaux (du moins pour moi en 2.5, peut-être que je devrais mettre à jour ...) –

Répondre

14

commentaire Chris Lutz est correct.

~ est le bitwise negation operator

On dirait qu'il se A à - (A + 1), car sur de nombreux ordinateurs modernes, les nombres négatifs sont représentés comme Two's Complement de l'entier positif correspondant, où le nombre est soustrait 2^(bit length) (c'est "deux à la puissance de la longueur de bit", pas "deux exclusivité ou longueur de bit" ...).

Dans un tel système, -1 serait représenté par tous les uns. Bien sûr, voilà ce que la somme d'un nombre et son négatif au niveau du bit, nous avons donc la situation où

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

comme vous avez remarqué.

0

Le point est de pouvoir prendre le complément des vales dans un tableau. Dans le cas de numpy il semble être un raccourci pour les éléments suivants:

>>> 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

Le ~ est l'opérateur ones' complement et si vous utilisez avec ints il peut être utilisé dans tout programme de python (ce n'est pas exclusivement numpy)

+0

Je ne suis pas si sûr la ligne suivante: ~ list [1,2,3] échoue puisque l'opérateur unaire n'a pas été défini pour les listes, l'objet de classe doit les avoir définis comme n'importe quel autre opérateur. – Hooked

+0

vous avez raison, je ne l'ai pas vérifié avec des listes –