2016-08-08 3 views
5

アレイサブクラスをnpyファイルに保存し、後で結果を回復できるようにしたいと考えています。以下のようなnd.sysをndarrayサブクラスで使用するにはどうすればよいですか?

何か:

>>> class MyArray(np.ndarray): pass 
>>> data = MyArray(np.arange(10)) 
>>> np.save('fname', data) 
>>> data2 = np.load('fname') 
>>> assert isinstance(data2, MyArray) # raises AssertionError 

the docsは(強調鉱山)言う:

形式は明示的には必要ありません:完全

  • [...]

    • numpy.ndarrayの任意のサブクラスを処理します。書き込み用にサブクラスが になりますが、配列データのみが書き出されます。 通常のnumpy.ndarrayオブジェクトは、ファイルの読み取り時に作成されます。 APIを使用して、特定のサブクラスのフォーマットを構築することができますが、一般的なNPYフォーマットの範囲外の です。
  • だから、上記のコードはAssertionErrorがを上げないとすることができますか?

    +0

    データを(numpy.load経由で)読み込むときにnumpyがあなたのサブクラスを知っているように、データを 'npy'ファイルに格納する方法を尋ねていますか? [ビューキャスト](http://docs.scipy.org/doc/numpy/user/basics.subclassing.html#view-casting)を使用して解決策を探す_その後、バニラの配列としてデータを読み取ることができますか? – mgilson

    +0

    @mgilson:ビューのキャストはあまりありません。私はファイルをプログラマではなく、どのようなクラスにするべきかをエンコードしたい。また、理想的には私のクラスのプロパティに対応する自分のメタデータをいくつか保存することができます。 – Eric

    答えて

    2

    np.saveが配列のサブクラスを処理するという証拠はありません。

    np.matrixを保存しようとしましたが、ndarrayに戻ってきました。

    私はnp.ma配列を保存しようとした、と保存がdtypeがオブジェクトである場合、それはそうpickle.dump(array, fp ...)

    を使用しています

    _write_array_header() # save dtype, shape etc 
    

    をしている、np.lib.npyio.format.write_arrayによって行われるエラー

    NotImplementedError: MaskedArray.tofile() not implemented yet. 
    

    を得ましたそれはarray.tofile(fp)です。 tofileはデータバッファの書き込みを処理します。

    配列のpickle.dumpnp.saveを使用して終了しますが、どのようにトリガーされたかは思い出せません。

    pickleアレイの私ができる

    、およびそれを読み込む:

    In [657]: f=open('test','wb') 
    In [658]: pickle.Pickler(f).dump(x) 
    In [659]: f.close() 
    In [660]: np.load('test') 
    In [664]: f=open('test','rb') 
    In [665]: pickle.load(f) 
    

    このpickleダンプ/ロード・シーケンスは、テストnp.manp.matrixsparse.coo_matrix例のために動作します。したがって、おそらく自分のサブクラスのための探索の方向です。

    numpyおよびpickleで検索しました。Preserve custom attributes when pickling subclass of numpy arrayが見つかりました。答えはカスタム.__reduce__.__setstate__です。

    関連する問題