Numpyで_.T
_属性を使用してndarray
の転置バージョンを取得すると非常に便利です。ただし、共役転置を取得する同様の方法はありません。 Numpyの行列クラスには_.H
_演算子がありますが、ndarrayはありません。読みやすいコードが好きで、常に.conj().T
を書くのが面倒なので、_.H
_プロパティを常に利用できるようにしたいと思います。この機能を追加するにはどうすればよいですか? numpyがインポートされるたびに無意識に利用できるように追加することは可能ですか?
(_.I
_逆演算子について同様の質問をすることができます。)
一般に、この問題の難しさは、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]]
次のように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
希望する動作が得られます。