2010-08-06 5 views
7

я наткнулся на строку кода с помощью NumPy Python, который выглядел так:Что делает унарный оператор ~ в 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. Возможно, мне нужно обновить ...) –

ответ

14

Chris Lutz»является правильным.

~ является bitwise negation operator

Похоже получается А - (А + 1), так как на многих современных компьютерах, отрицательные числа представляются в виде Two's Complement соответствующего положительного целого числа, где число вычитается из 2^(bit length) (это «два для длины бит», а не «две эксклюзивные или бит длины» ...).

В такой системе -1 будет представлен как все. Конечно, так будет сумма ряда и его побитового отрицательным, поэтому мы имеем ситуацию, когда

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

, как вы заметили.

0

Суть заключается в том, чтобы иметь возможность дополнить значения vales в массиве. В случае 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

The ~ является ones' complement оператор, и если вы используете с Интс он может быть использован в любой программе питона (это не исключительно NumPy)

+0

Я не уверен, следующая строка: ~ list [1,2,3] терпит неудачу, так как унарный оператор не был определен для списков, объект класса должен определять их так же, как и любой другой оператор. – Hooked

+0

Вы правы, я не проверил его со списками –