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”的主要内容,如果未能解决你的问题,请参考以下文章