Conjugate transpose operator “.H” in numpy

五迷三道 提交于 2019-12-29 04:38:27

问题


It is very convenient in numpy to use the .T attribute to get a transposed version of an ndarray. 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.)


回答1:


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.random((3, 3)).view(myarray)
a.H

will give you the desired behavior.




回答2:


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


来源:https://stackoverflow.com/questions/26932461/conjugate-transpose-operator-h-in-numpy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!