问题
It is very convenient in numpy to use the .T
attribute to get a transposed version of an ndarray
. However, there is no similar way to get the conjugate transpose. Numpy's matrix class has the .H
operator, but not ndarray. Because I like readable code, and because I'm too lazy to always write .conj().T
, I would like the .H
property to always be available to me. How can I add this feature? Is it possible to add it so that it is brainlessly available every time numpy is imported?
(A similar question could by asked about the .I
inverse operator.)
回答1:
You can subclass the ndarray
object like:
from numpy import ndarray
class myarray(ndarray):
@property
def H(self):
return self.conj().T
such that:
a = np.random.random((3, 3)).view(myarray)
a.H
will give you the desired behavior.
回答2:
In general, the difficulty in this problem is that Numpy is a C-extension, which cannot be monkey patched...or can it? The forbiddenfruit module allows one to do this, although it feels a little like playing with knives.
So here is what I've done:
Install the very simple forbiddenfruit package
Determine the user customization directory:
import site print site.getusersitepackages()
In that directory, edit
usercustomize.py
to include the following: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)))
Test it:
python -c python -c "import numpy as np; A = np.array([[1,1j]]); print A; print A.H"
Results in:
[[ 1.+0.j 0.+1.j]] [[ 1.-0.j] [ 0.-1.j]]
来源:https://stackoverflow.com/questions/26932461/conjugate-transpose-operator-h-in-numpy