共轭转置算子".H"在numpy中

ben*_*pro 17 python arrays monkeypatching numpy matrix

在numpy中使用该.T属性获取转置版本是非常方便的ndarray.然而,没有类似的方法来获得共轭转置.Numpy的矩阵类有.H运算符,但不是ndarray.因为我喜欢可读的代码,而且因为我总是懒得写.conj().T,所以我希望这个.H属性永远都可供我使用.如何添加此功能?是否有可能添加它以便每次进口numpy时都可以无脑地使用它?

(类似的问题可以通过询问.I逆运算符.)

Sau*_*tro 13

您可以将ndarray对象子类化为:

from numpy import ndarray

class myarray(ndarray):    
    @property
    def H(self):
        return self.conj().T
Run Code Online (Sandbox Code Playgroud)

这样:

a = np.random.random((3, 3)).view(myarray)
a.H
Run Code Online (Sandbox Code Playgroud)

会给你想要的行为......


ben*_*pro 12

一般来说,这个问题的难点在于Numpy是一个C-extension,它不能被猴子修补......或者可以吗?该forbiddenfruit模块允许一个做到这一点,虽然感觉有点像用刀子玩.

所以这就是我所做的:

  1. 安装非常简单的forbiddenfruit

  2. 确定用户自定义目录:

    import site
    print site.getusersitepackages()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在该目录中,编辑usercustomize.py以包括以下内容:

    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)))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 测试一下:

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

    结果是:

    [[ 1.+0.j  0.+1.j]]
    [[ 1.-0.j]
     [ 0.-1.j]]
    
    Run Code Online (Sandbox Code Playgroud)