5

numpyをサブクラス化して属性を追加しようとしてMaskedArrayいますが、適切な結果を得ることができないようです。

をサブクラス化するための例に従うことから始めましたnumpy.ndarray。これは正常に機能します。

numpy.ma.MaskedArray次に、代わりに次のようにサブクラス化してみました。

import numpy as np

class MyMaskedArray(np.ma.MaskedArray):

    def __new__(cls, input_array, info=None):
        obj = np.asarray(input_array).view(cls)
        obj.info = info
        return obj

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

arr = np.arange(5)
obj = MyMaskedArray(arr, info='information')
print obj.info
print obj[1:].info

その結果、

information
None

「情報」を二度期待していました。

obj = np.asarray(input_array).view(cls)線をその問題に置き換えるか、obj = np.ma.MaskedArray(input_array).view(cls)または解決しませんでした(私はこのように進みました。これは、サブクラスの将来の化身に合格しobj = np.ma.MaskedArray.__new__(cls, input_array)たいからです)。*args**kwargs__new__

サブクラスの例とは対照的にMaskedArray.__array_finalize、サブクラスのに呼び出しを追加する必要があることに注意してください。そうしないと、属性が見つかりません。__array_finalize__ndarray_mask

おそらく誰かが私を啓発することができます:

  • obj[1:].infoオリジナルを維持する方法obj.info

  • なぜndarrayスーパークラスの呼び出しは必要ありませんが、必要です__array_finalize__MaskedArrayボーナスの質問の詳細)。

コンテナクラスを作成する代わりにサブクラスを作成したいと思います。後者は、 sMaskedArrayに付属するいくつかの便利さを失うからです。MaskedArray

(注: /の問題はすでに「解決」しているため、これはこの質問と同じではありません。)__init____new__

4

1 に答える 1

2

スライスが希望どおりに機能するようにするには、オーバーロードする必要があります__getitem__

def __getitem__(self, item):
    out = np.ma.MaskedArray.__getitem__(self, item)
    out.info = self.info
    return out

同上__setitem__

info例のように、属性が比較的単純な場合は、この目的のために設計されたの_optinfo属性を確認することをお勧めしますMaskedArray。これは、何らかの方法で保持する必要のある情報を格納する単なる辞書です。次に例を示します。

class MyMaskedArray(np.ma.MaskedArray):

    def __new__(cls, input_array, info=None):
        obj = np.asarray(input_array).view(cls)
        obj._optinfo['info'] = info
        return obj

    @property
    def info(self):
        return self._optinfo.get('info', None)

ここで.infoは、は読み取り専用のプロパティですが、書き込み可能にするのは簡単です。

__array_finalize__

私はあなたの質問を理解するかどうかわかりません:ndarrayそれ自体がスーパークラスです。MaskedArrayはのサブクラスであるため、特に(引数を介して)マスクを設定する方法を指示するメソッドndarrayを定義する必要があります。サブクラス化の詳細については、このリンクを確認してください。__array_finalize___mask

あなたの例では、あなたはあなた自身を使ってあなたの属性__array_finalize__を設定します。.infoその場合、親メソッドを呼び出す必要があります。これはMaskedArray.__array_finalize__基本的なPythonサブクラスです。__array_finalize__道を進むかどうかを明示的に定義する必要はないことに注意してください_optinfo...

ノート

  • __array_prepare__and__array_wrap__メソッドは、実際には、サブクラスに関数を適用する前にサブクラスのインスタンスを準備しndarray、関数の結果を処理するために使用されます。
于 2013-01-28T23:53:44.133 に答える