numpy ndarray をサブクラス化しようとしていますが、マスクされた配列やマトリックスなどの他の numpy 型で操作を正しく行うことができません。__array_priority__が尊重されていないように思えます。例として、重要な側面を模倣するダミー クラスを作成しました。
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
私のクラスと通常のndarray 間の操作は期待どおりに機能します:
>>> c1 = C((3, 3))
>>> o1 = np.ones((3, 3))
>>> print(o1 * c1)
__mul__
42
>>> print(c1 * o1)
__rmul__
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
行列とマスクされた配列の ufunc がラップされる方法は、配列の優先順位を尊重しないように思えます。これは事実ですか?回避策はありますか?