6

numpyのクラスをサブクラス化しようとしndarrayていますが、うまくいきました。私が望む動作は、ドキュメントに記載されているとほぼ同じです。配列にパラメーターを追加したいと思いますname(データの元の場所を追跡するために使用します)。

class Template(np.ndarray):
    """A subclass of numpy's n dimensional array that allows for a
    reference back to the name of the template it came from.
    """
    def __new__(cls, input_array, name=None):
        obj = np.asarray(input_array).view(cls)
        obj.name = name
        return obj

    def __array_finalize__(self, obj):
        if obj is None: return
        self.name = getattr(obj, 'name', None)

これは機能しますが、この質問のように、サブクラスを含む変換がサブクラスの別のインスタンスを返すことを除いて.

numpy 関数が のインスタンスを返す場合がありますTemplate:

>>> a = Template(np.array([[1,2,3], [2,4,6]], name='from here')
>>> np.dot(a, np.array([[1,0,0],[0,1,0],[0,0,1]]))
Template([[1, 2, 3],
       [2, 4, 6]])

ただし、そうでない場合もあります。

>>> np.dot(np.array([[1,0],[0,1]]), a)
array([[1, 2, 3],
       [2, 4, 6]])

上記でリンクした質問では、OP が__wrap_array__サブクラスのメソッドをオーバーライドする必要があることが提案されました。しかし、これには何の正当性も見当たらない。状況によっては、デフォルトで期待どおりの動作が得られます__array_wrap__ドキュメントは、より高い値のために他の引数の__array_wrap__メソッドが呼び出されている状況に遭遇していることを示唆しているようです:__array_priority__

ufunc ( np.add) は、最大値__array_wrap__を持つ入力のメソッドを呼び出していることに注意してください。__array_priority__

したがって、私の質問には関連する部分がいくつかあります。最初:常に呼び出されるようにサブクラスの属性を設定できますか? __array_priority____array_wrap__2 番目:これは、目的の動作を実現するための最善/最も簡単な方法ですか?

4

1 に答える 1

0

2 つのオブジェクトの __array_priority__ が同じ場合:

>>> np.array([[1,0],[0,1]]).__array_priority__
0.0
>>> a.__array_priority__
0.0

また、使用できるオブジェクトのメソッドは 1 つだけです。結合は、最初の配列/オブジェクトのメソッドを使用して解決されます。(あなたの場合は__array_wrap__)

質問からは、(継承によって) 同じであるか、オーバーライドされているため、クラスのメソッドを常に優先する必要があるようです。

したがって、__array_priority__ を上げます。

class Template(np.ndarray):
    __array_priority__ = 1.0 (Or whichever value is high enough)
    ...

テンプレートオブジェクトが計算のどこにあるかに関係なく、これを行った後。そのメソッドは、標準の配列のメソッドよりも優先されます。

于 2014-06-05T11:17:59.380 に答える