我正在尝试对 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 的方式不尊重数组优先级。是这样吗?有解决方法吗?