2010-08-06 59 views
7

我碰到了一行代碼使用Python的numpy的,看起來像這樣:一元運算符〜在numpy中做什麼?

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

它給輸出:

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

是否單目運算符(〜)採取陣列和應用 - > - (A + 1)

如果是這樣,什麼意思?

+2

它似乎是按位否定,就像它在C中一樣。運算符適用於普通的Python整數(至少它對我來說是2.5中的值,也許我應該升級...) – 2010-08-06 21:47:07

回答

14

克里斯·魯茨」的評論是正確的。

〜就是bitwise negation operator

它看起來像它原來A到 - (A + 1),因爲在許多現代計算機,負數表示爲相應的正整數的Two's Complement,其中數從減去2^(bit length)(這是「兩個位長度的權力」,而不是「兩個獨佔或位長度」)。

在這樣的系統中,-1將被表示爲全1。 當然,這樣將一個數字,它按位負的總和,所以我們必須在那裏

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

,你注意到了有關情況。

0

重點是能夠取數組中的值的補碼。在numpy的的情況下,它似乎是簡寫如下:

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

的〜是ones' complement運營商,如果你與整數使用它可以在任何的Python程序中使用(這不是numpy的的獨家)

+0

我不太確定,以下行: 〜list [1,2,3] 失敗,因爲沒有爲列表定義一元運算符,所以類對象必須讓它們像任何其他運算符一樣定義它們。 – Hooked 2010-08-06 21:57:15

+0

你說得對,我沒有用列表檢查過它 – 2010-08-06 22:00:52