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

时间:2014-11-14 14:41:05

标签: python arrays numpy matrix monkeypatching

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

(关于.I逆运算符的问题可以提出类似的问题。)

3 个答案:

答案 0 :(得分:11)

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

from numpy import ndarray

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

这样:

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

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

答案 1 :(得分:10)

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

所以这就是我所做的:

  1. 安装非常简单的forbiddenfruit

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

    import site
    print site.getusersitepackages()
    
  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)))
    
  4. 测试一下:

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

    结果:

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

答案 2 :(得分:0)

使用 arr.conj().T

这是一个例子

ZeroKet = np.array([[1j], [-2j]])
ZeroBra = Zero.conj().T