ben*_*pro 17 python arrays monkeypatching numpy matrix
在numpy中使用该.T
属性获取转置版本是非常方便的ndarray
.然而,没有类似的方法来获得共轭转置.Numpy的矩阵类有.H
运算符,但不是ndarray.因为我喜欢可读的代码,而且因为我总是懒得写.conj().T
,所以我希望这个.H
属性永远都可供我使用.如何添加此功能?是否有可能添加它以便每次进口numpy时都可以无脑地使用它?
(类似的问题可以通过询问.I
逆运算符.)
Sau*_*tro 13
您可以将ndarray
对象子类化为:
from numpy import ndarray
class myarray(ndarray):
@property
def H(self):
return self.conj().T
Run Code Online (Sandbox Code Playgroud)
这样:
a = np.random.random((3, 3)).view(myarray)
a.H
Run Code Online (Sandbox Code Playgroud)
会给你想要的行为......
ben*_*pro 12
一般来说,这个问题的难点在于Numpy是一个C-extension,它不能被猴子修补......或者可以吗?该forbiddenfruit模块允许一个做到这一点,虽然感觉有点像用刀子玩.
所以这就是我所做的:
安装非常简单的forbiddenfruit包
确定用户自定义目录:
import site
print site.getusersitepackages()
Run Code Online (Sandbox Code Playgroud)在该目录中,编辑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)))
Run Code Online (Sandbox Code Playgroud)测试一下:
python -c python -c "import numpy as np; A = np.array([[1,1j]]); print A; print A.H"
Run Code Online (Sandbox Code Playgroud)
结果是:
[[ 1.+0.j 0.+1.j]]
[[ 1.-0.j]
[ 0.-1.j]]
Run Code Online (Sandbox Code Playgroud)