【问题标题】:Conjugate transpose operator ".H" in numpynumpy中的共轭转置运算符“.H”
【发布时间】:2026-02-02 18:00:01
【问题描述】:

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

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

【问题讨论】:

    标签: python arrays numpy matrix monkeypatching


    【解决方案1】:

    您可以将ndarray 对象子类化,例如:

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

    这样:

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

    会给你想要的行为。

    【讨论】:

    • 谢谢,但我希望有一个猴子补丁类型的解决方案,我仍然可以在任何地方使用 ndarray,例如A = np.random.randn(3,3) + 1j*np.random.randn(3,3); B = A.H.dot(A)
    • @benpro 我明白了...但是this would be trickier
    【解决方案2】:

    一般来说,这个问题的难点在于 Numpy 是一个 C 扩展,不能猴子补丁......或者可以吗? 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]]
      

    【讨论】:

      【解决方案3】:

      使用 arr.conj().T

      这是一个例子

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

      【讨论】: