2010-08-06 6 views
7

stieß ich auf eine Zeile Code Python numpy verwenden, das so aussah:Was macht der unäre Operator in numpy?

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

Und es gab den Ausgang:

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

Hat der unären Operator (~) ein Array und wendet A -> - (A + 1)

Wenn ja, was ist der Punkt?

+2

Es scheint, als wäre es eine bitweise Negation, genau wie in C. Der Operator gilt für normale Python-Ganzzahlen (zumindest für mich in 2.5. Vielleicht sollte ich upgraden ...) –

Antwort

14

Chris Lutz‘Kommentar korrekt ist.

~ ist die bitwise negation operator

Es sieht aus wie es A dreht sich um - (A + 1), weil auf vielen modernen Computern, negative Zahlen werden als Two's Complement der entsprechende positive ganze Zahl repräsentiert, wobei die Zahl subtrahiert wird von 2^(bit length) (das ist "zwei auf die Macht der Bitlänge", nicht "zwei exklusive oder Bitlänge" ...).

In einem solchen System würde -1 als alle Einsen dargestellt werden. Natürlich, so dass die Summe einer Anzahl und negativen seine bitweise würde, also haben wir die Situation, in der

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

wie Sie bemerkt.

0

Der Punkt ist in der Lage, das Komplement der vales in einem Array zu nehmen. Im Fall von numpy erscheint es für die folgende Kurzschrift zu werden:

>>> 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 ~ ist der ones' complement Operator, und wenn Sie mit ints verwenden es kann in jedem Python-Programm verwendet werden (es ist nicht ausschließlich von numpy)

+0

Ich bin mir nicht so sicher, die folgende Zeile: ~ list [1,2,3] schlägt fehl, da der unäre Operator nicht für Listen definiert wurde, das Klassenobjekt muss sie wie jeder andere Operator definiert haben. – Hooked

+0

Sie haben Recht, ich habe es nicht mit Listen überprüft –