私はサブクラスnumpy
のndarray
クラスにしようとしていて、運が少しありました。私が望む動作は、ドキュメントに記載されている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番目:これは私の希望する行動を達成するための最善の方法ですか?