3

サブクラスを書き込もうとしていmasked_arrayます。私がこれまでに持っているのはこれです:

class gridded_array(ma.core.masked_array):
    def __init__(self, data, dimensions, mask=False, dtype=None,
                 copy=False, subok=True, ndmin=0, fill_value=None,
                 keep_mask=True, hard_mask=None, shrink=True):
        ma.core.masked_array.__init__(data, mask, dtype, copy, subok,
                                      ndmin, fill_value, keep_mask, hard_mask,
                                      shrink)
        self.dimensions = dimensions

ただし、今作成するgridded_arrayと、期待したものが得られません。

dims = OrderedDict()
dims['x'] = np.arange(4)
gridded_array(np.random.randn(4), dims)

masked_array(data = [-- -- -- --],
             mask = [ True  True  True  True],
             fill_value = 1e+20)

マスクされていない配列を期待します。dimensions私が渡した引数が呼び出しで渡されるのではないかと疑っていますmasked_array.__init__が、私はOOPにまったく慣れていないため、これを解決する方法がわかりません。

どんな助けでも大歓迎です。

PS:私はPython2.7を使用しています

4

2 に答える 2

3

警告の言葉:あなたがOOPにまったく慣れていない場合、サブクラスndarrays化しMaskedArraysていて、始めるのに最も簡単な方法ではありません...

何よりもまず、このチュートリアルにアクセスして確認する必要があります。これで、サブクラス化に関連するメカニズムが紹介されますndarrays

MaskedArraysのように、ではなく、クラスインスタンスを作成するためndarraysのメソッドを使用します。サブクラスのに到達するまでに、実際の初期化がメソッドに委任された、完全にインスタンス化されたオブジェクトがすでに存在します。簡単に言うと、標準のPythonオブジェクトで期待するように機能しません。(実際、それがまったく呼び出されているのだろうか...後で、正しく思い出せば...__new____init____init____array_finalize____init____array_finalize__

警告が表示されたので、サブクラス化の面倒を本当に経験する必要があるかどうかを検討することをお勧めしますndarray

  • あなたの目的は何gridded_arrayですか?
  • のすべての方法をサポートする必要がありますndarraysか、それとも一部のみをサポートする必要がありますか?すべてのdtype?
  • オブジェクトの単一の要素またはスライスを取得するとどうなりますか?
  • gridded_arraysNumPy関数の入力として広く使用しますか?

疑問がある場合は、属性(たとえば、)として(または)gridded_arrayをとるジェネリッククラスとして設計し、で操作する必要があるメソッドのみを追加する方が簡単な場合があります。ndarrayMaskedArraygridded_array._arrayself._array

提案

  • の各アイテムに「タグ付け」するだけでよい場合は、パンダgridded_arrayに興味があるかもしれません。
  • floatを処理するだけでよい場合はMaskedArray、少しやり過ぎかもしれません。nans無効なデータを表すために使用するだけで、多くのnumpy関数にnans同等のものがあります。最悪のgridded_array場合、必要に応じていつでもマスクできます。withのサブクラスを表示するとndarray.view(np.ma.MaskedArray)入力のマスクされたバージョンが返されます...
于 2012-09-26T10:04:57.967 に答える
0

問題は、の代わりにをmasked_array使用することです。そのため、引数が誤って解釈されています。__new____init__dimensions

オーバーライド__new__するには、次を使用します。

class gridded_array(ma.core.masked_array):
    def __new__(cls, data, dimensions, *args, **kwargs):
        self = super(gridded_array, cls).__new__(cls, data, *args, **kwargs)
        self.dimensions = dimensions
        return self
于 2012-09-26T10:00:45.073 に答える