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

1 つの回避策は、サブクラス化すること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

この場合、優先度も a よりも高く、np.ndarray乗算メソッドは常に呼び出されます。

コメントに追加されているように、相互運用性が必要な場合に備えて、複数のクラスからサブクラス化できます。

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