使用.T
属性来获取ndarray
的转置版本非常方便。然而,没有类似的方法来获得共轭转置。 Numpy的矩阵类有.H
运算符,但不是ndarray。因为我喜欢可读代码,而且因为我总是懒得写.conj().T
,所以我希望.H
属性始终可用。如何添加此功能?是否有可能添加它以便每次进口numpy时都能无脑地使用它?
(关于.I
逆运算符的问题可以提出类似的问题。)
答案 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模块允许人们这样做,虽然感觉有点像玩刀。
所以这就是我所做的:
安装非常简单的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]]
答案 2 :(得分:0)
使用 arr.conj().T
这是一个例子
ZeroKet = np.array([[1j], [-2j]])
ZeroBra = Zero.conj().T