2010-08-06 12 views
7

mi sono imbattuto in una riga di codice utilizzando NumPy di ​​Python che si presentava così:Cosa fa l'operatore unario ~ in numpy?

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

e ha dato l'output:

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

fa l'operatore unario (~) prendere un array e applicare un -> - (A + 1)

Se sì, qual è il punto?

+2

Sembra la negazione bit per bit, proprio come in C. L'operatore si applica ai normali numeri interi di Python (almeno lo fa per me in 2.5. Forse dovrei aggiornare ...) –

risposta

14

Chris Lutz' è corretto.

~ è la bitwise negation operator

Sembra si trasforma A - (A + 1) perché su molti computer moderni, i numeri negativi sono rappresentati come il Two's Complement del corrispondente numero intero positivo, in cui il numero è sottratto 2^(bit length) (ovvero "due alla potenza della lunghezza del bit", non "due esclusivi o lunghezza del bit" ...).

In tale sistema, -1 sarebbe rappresentato come tutti. Naturalmente, così sarebbe la somma di un numero di bit per bit e il suo negativo, quindi abbiamo la situazione in cui

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

come avete notato.

0

Il punto deve essere in grado di assumere il complemento delle vales in un array. Nel caso di NumPy sembra essere una scorciatoia per il seguente:

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

Il ~ è l'operatore ones' complement e se si sta utilizzando con interi può essere utilizzato in qualsiasi programma Python (non è esclusivamente di numpy)

+0

Non ne sono così sicuro, la riga seguente: ~ lista [1,2,3] non riesce poiché l'operatore unario non è stato definito per gli elenchi, l'oggetto classe deve averli definiti come qualsiasi altro operatore. – Hooked

+0

hai ragione, non l'ho controllato con le liste –