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 番目:これは、目的の動作を実現するための最善/最も簡単な方法ですか?