2

私は次のクラスを持っています:

class autoArray2(numpy.ndarray):
    def __new__(self, *args, **kwargs):
        obj = numpy.array(*args, **kwargs)
        return(obj)

    def __setitem__(self, coords, value):
        print("HERE")

ただし、array.__setitem__指定したものではなく、が呼び出されているようです。

a = numpy.array([[1,2],[2,3]])
b = autoArray2(a)
a[0,0] = 1

「ここ」は印刷されません。

4

1 に答える 1

3

numpy配列をサブクラス化するのは少し注意が必要です。 サブクラスを作成する場合は、 Stefan vanderWaltのスライドnumpyドキュメントから始めるとよいでしょう。

import numpy as np

class AutoArray2(np.ndarray):
    def __new__(cls, input_array):
        # Input array is an already formed ndarray instance
        # We first cast to be our class type
        obj = np.asarray(input_array).view(cls)
        return obj
    def __array_finalize__(self, obj):
        if obj is None: return
    def __setitem__(self, coords, value):
        print("HERE")

a = np.array([[1,2],[2,3]])
b = AutoArray2(a)
b[0,0] = 1

収量

HERE

重要な要素はへの呼び出しview(cls)です。ndarrayこれがないと、AutoArray2インスタンスではなく、プレーンが返されます。

また、-プレーンa[0,0] = 1を使用しています。を使用するには、が必要です。andarrayb__setitem__b[0,0] = 1

于 2012-10-02T22:40:08.100 に答える