2012-05-04 10 views
5

私はサブクラスnumpyndarrayクラスにしようとしていて、運が少しありました。私が望む動作は、ドキュメントに記載されているexampleとほぼ同じです。私は配列にパラメータnameを追加したいと思います(データの元の場所を追跡するために使用します)。変換中に戻り値としてnumpyのndarrayサブクラスを保持する。 __array_priority__を安全に設定できますか?

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) 

私は私のサブクラスを含む任意の変換は私のサブクラスの別のインスタンスを返すようにしたいthis questionのようにこれは、ことを除いて、動作します。時々そうではない、しかし

>>> 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があることが示唆された

時々numpyの機能がTemplateのインスタンスを返却しますサブクラスのメソッド__wrap_array__をオーバーライドする必要があります。しかし、私はこれに正当化は見られません。状況によっては、デフォルトの__array_wrap__で予想される動作が得られます。 ufunc(np.add)は の__array_wrap__方法入力と呼ばれたこと

注:The docsは、私はそれが原因で高い__array_priority__値で呼び出されている他の引数の__array_wrap__方法だな状況に実行していることを示唆しているように見えます最高で__array_priority__

私の質問はいくつかの関連する部分があります。最初:__array_wrap__が常に呼び出されるようにサブクラスの__array_priority__属性を設定できますか? 2番目:これは私の希望する行動を達成するための最善の方法ですか?

答えて

0

2つのオブジェクトが同じ__array_priority__を有する:

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

、唯一のオブジェクトのメソッドを使用することができ、タイは、第一の配列の/オブジェクトのメソッドを使用することによって解決されます。 (あなたのケースでは__array_wrap__)

質問から、あなたのクラスのメソッドは、(継承を介して)同じか、またはオーバーライドされているので、常に優先されるように思えます。

だから、私は__array_priority__をクランクするだけです。

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

テンプレートオブジェクトがどこにあるかにかかわらず、これを実行した後。標準配列のメソッドよりもメソッドが優先されます。

関連する問題