Tilde means very different things in Python vs. Matlab!

For those transitioning between Matlab/Octave and Python, the “logical not” tilde ~ operator of Matlab/Octave is NOT matched in Python.

In Python (on non-Numpy variables), ~ means unary complement. ~ operates on the bits of the byte underlying each non-Numpy Boolean (in Matlab/Octave, boolean is class logical)


  • Numpy does not allow the word not for Numpy arrays.
  • safest way (if cumbersome) is to always use numpy.logical_not().
  • If you know you won’t have any Numpy arrays, you can use the word not.
  • If you know you always have Numpy arrays, you can use ~, but it’s safer to use numpy.logical_not().
  • not will at least throw a ValueError if you use it on a Numpy array, rather than silently giving the wrong value as ~ will on non-Numpy arrays.

My operating practice is to use not or logical_not() and avoid ~ to avoid silent failures.

Type ~ operation
non-Numpy unary complement ~False ==- 1; ~True == -2
Numpy logical not x=numpy.array(False); ~x==True; ~~x==False
Matlab logical not ~false = true; ~true==false

This critically important distinction comes from the short int (byte) inherited by the Python bool.