Conjugate transpose operator ".H" in numpy
Solution 1
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:
Install the very simple forbiddenfruit package
-
Determine the user customization directory:
import site print site.getusersitepackages()
-
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)))
-
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]]
Solution 2
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.
benpro
Updated on August 11, 2021Comments
-
benpro almost 3 years
It is very convenient in numpy to use the
.T
attribute to get a transposed version of anndarray
. However, there is no similar way to get the conjugate transpose. Numpy's matrix class has the.H
operator, but not ndarray. Because I like readable code, and because I'm too lazy to always write.conj().T
, I would like the.H
property to always be available to me. How can I add this feature? Is it possible to add it so that it is brainlessly available every time numpy is imported?(A similar question could by asked about the
.I
inverse operator.)