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が行列のためにラップされ、マスクされた配列は配列の優先順位を尊重しないようです。これは本当ですか?回避策はありますか?
それらが整列されていないので、実際には、エラーメッセージが、np.matrix((3 '以来、与えられています3)) 'は' np.asmatrix(np.ones((3,3))) 'と同じではありません。しかし、問題はまだ残っていますが、 'm * c1'は動作していません。 –
@ GustavLarssonそれを見つけてくれてありがとう。私はそれを修正し、動機づけの詳細を追加しました。 – Hernan