2013-07-31 5 views
6

numpy ndarrayをサブクラス化しようとしていますが、マスク配列や行列など他のnumpy型の演算を正しく実行できません。 __array_priority__は尊重されていないようです。私が操作しようとしたときに、numpy配列の派生クラスが行列とマスク配列でうまく動かない

>>> c1 = C((3, 3)) 
>>> o1 = np.ones((3, 3)) 
>>> print(o1 * c1) 
__mul__ 
42 
>>> print(c1 * o1) 
__rmul__ 
42 

しかし:私のクラスと通常 ndarray作業の間

import numpy as np 

class C(np.ndarray): 

    __array_priority__ = 15.0 

    def __mul__(self, other): 
     print("__mul__") 
     return 42 

    def __rmul__(self, other): 
     print("__rmul__") 
     return 42 

オペレーション期待通り:一例として、私は重要な側面を模倣ダミークラスを作成しました行列(またはマスクされた配列)では、配列の優先順位は尊重されません。

>>> m = np.matrix((3, 3)) 
>>> print(c1 * m) 
__mul__ 
42 
>>> print(m * c1) 
Traceback (most recent call last): 
... 
    File "/usr/lib64/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 330, in __mul__ 
    return N.dot(self, asmatrix(other)) 
ValueError: objects are not aligned 

ufuncsが行列のためにラップされ、マスクされた配列は配列の優先順位を尊重しないようです。これは本当ですか?回避策はありますか?

+1

それらが整列されていないので、実際には、エラーメッセージが、np.matrix((3 '以来、与えられています3)) 'は' np.asmatrix(np.ones((3,3))) 'と同じではありません。しかし、問題はまだ残っていますが、 'm * c1'は動作していません。 –

+0

@ GustavLarssonそれを見つけてくれてありがとう。私はそれを修正し、動機づけの詳細を追加しました。 – Hernan

答えて

2

つの回避策はnp.matrixib.defmatrix.matrixをサブクラス化することです。この場合は

class C(np.matrixlib.defmatrix.matrix): 

    __array_priority__ = 15.0 

    def __mul__(self, other): 
     print("__mul__") 
     return 42 

    def __rmul__(self, other): 
     print("__rmul__") 
     return 4 

優先順位がnp.ndarrayとあなたの乗算メソッドが常に呼び出され、その後も高くなっています。

コメントで追加として、あなたが相互運用性を必要とする場合、複数のクラスからサブクラス化することができます

​​
+0

これはうまく動作しますが、私のクラスはマトリックスよりもndarrayによってよく記述されています。さらに、クラスはndarray、matrix、masked darrayと相互運用する必要があります。これを達成する方法はありますか? – Hernan

+0

このアプローチを使用して、相互運用性が達成されているかどうかを確認してください。そうでない場合、クラスC(np.matrixlib.defmatrix.matrix、np.ndarray): 'のように複数のクラスからサブクラス化できます。 .. –

+0

クラスを 'class C(np.matrixlib.defmatrix.matrix、np.ma.core.MaskedArray、np.ndarray):'として再定義しました。それは醜いですが、動作するようですが、私はまだもっと多くのテストケースが必要です。私は今、配列をラップするクラスのために(サブクラス化せずに)同じことをしようとしています。もう一度、ndarrayで乗算するときはうまく動作しますが、他のものではうまく動作しません。 – Hernan

関連する問題