Conjugate transpose operator ".H" in numpy

You can subclass the ndarray object like:

from numpy import ndarray

class myarray(ndarray):    
    @property
    def H(self):
        return self.conj().T

such that:

a = np.random.rand(3, 3).view(myarray)
a.H

will give you the desired behavior.

Edit:

As suggested by @slek120, you can force to transpose only the last 2 axes with:

self.swapaxes(-2, -1).conj()

instead of self.conj().T.


In general, the difficulty in this problem is that Numpy is a C-extension, which cannot be monkey patched...or can it? The forbiddenfruit module allows one to do this, although it feels a little like playing with knives.

So here is what I've done:

  1. Install the very simple forbiddenfruit package

  2. Determine the user customization directory:

    import site
    print site.getusersitepackages()
    
  3. In that directory, edit usercustomize.py to include the following:

    from forbiddenfruit import curse
    from numpy import ndarray
    from numpy.linalg import inv
    curse(ndarray,'H',property(fget=lambda A: A.conj().T))
    curse(ndarray,'I',property(fget=lambda A: inv(A)))
    
  4. Test it:

    python -c python -c "import numpy as np; A = np.array([[1,1j]]);  print A; print A.H"
    

    Results in:

    [[ 1.+0.j  0.+1.j]]
    [[ 1.-0.j]
     [ 0.-1.j]]