numpy中的共轭转置运算符“.H”

Posted

技术标签:

【中文标题】numpy中的共轭转置运算符“.H”【英文标题】:Conjugate transpose operator ".H" in numpy 【发布时间】:2015-01-11 23:45:59 【问题描述】:

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

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

【问题讨论】:

【参考方案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 模块允许这样做,虽然感觉有点像玩刀。

这就是我所做的:

    安装非常简单的forbiddenfruit包

    确定用户自定义目录:

    import site
    print site.getusersitepackages()
    

    在该目录中,编辑 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)))
    

    测试一下:

    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

【讨论】:

以上是关于numpy中的共轭转置运算符“.H”的主要内容,如果未能解决你的问题,请参考以下文章

共轭矩阵怎么算?

怎么写出这个矩阵的共轭矩阵?

matlab中转置与共轭转置的问题

关于矩阵

使用 numpy 语法对 self 进行共轭转置

什么是共轭矩阵?