7

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

4

1 回答 1

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

在这种情况下,优先级也高于 anp.ndarray并且您的乘法方法总是被调用。

正如评论中所添加的,如果您需要互操作性,您可以从多个类中子类化:

class C(np.matrixlib.defmatrix.matrix, np.ndarray):
于 2013-07-31T17:05:21.733 回答