web-dev-qa-db-ja.com

numpyの共役転置演算子 ".H"

Numpyで_.T_属性を使用してndarrayの転置バージョンを取得すると非常に便利です。ただし、共役転置を取得する同様の方法はありません。 Numpyの行列クラスには_.H_演算子がありますが、ndarrayはありません。読みやすいコードが好きで、常に.conj().Tを書くのが面倒なので、_.H_プロパティを常に利用できるようにしたいと思います。この機能を追加するにはどうすればよいですか? numpyがインポートされるたびに無意識に利用できるように追加することは可能ですか?

(_.I_逆演算子について同様の質問をすることができます。)

20
benpro

一般に、この問題の難しさは、NumpyがCの拡張機能であり、サルのパッチを適用できないことです...それともできますか? forbiddenfruit モジュールはこれを可能にしますが、ナイフで遊ぶような感じがします。

だからここに私がやったことがあります:

  1. 非常に単純な forbiddenfruit パッケージをインストールします

  2. ユーザーカスタマイズディレクトリを決定します。

    import site
    print site.getusersitepackages()
    
  3. そのディレクトリで、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)))
    
  4. 試して:

    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]]
    
11
benpro

次のように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

希望する動作が得られます。

13