2016-08-08 6 views
5

Ich möchte in der Lage sein, meine Array-Unterklasse in einer NPY-Datei zu speichern und das Ergebnis später wiederherzustellen.Wie kann ich np.save für eine ndarray-Unterklasse arbeiten lassen?

Etwas wie:

>>> 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 sagt (Hervorhebung von mir):

Das Format explizit braucht nicht zu:

  • [...]
  • Fully handle beliebige Unterklassen von numpy.darray. Unterklassen werden zum Schreiben akzeptiert, aber nur die Array-Daten werden ausgeschrieben. Ein reguläres numpy.darray-Objekt wird beim Lesen der Datei erstellt. Die API kann verwendet werden, um ein Format für eine bestimmte Unterklasse, aber zu erstellen, das für das allgemeine NPY-Format nicht verfügbar ist.

So ist es möglich, den obigen Code zu machen keinen AssertionError erhöhen?

+0

Fragen Sie, wie Sie Daten in der 'npy'-Datei speichern, damit numpy Ihre Unterklasse beim Zurücklesen der Daten kennt (über numpy.load)? Ist eine Lösung, in der Sie [View-Casting] (http://docs.scipy.org/doc/numpy/user/basics.classing.html#view-casting) verwenden _nach_ Lesen der Daten als vanille-artiges Array OK? – mgilson

+0

@mgilson: View Casting ist nicht ganz. Ich möchte, dass die Datei codiert, in welcher Klasse sie angezeigt werden sollte, nicht der Programmierer. Außerdem könnte ich im Idealfall einige Metadaten speichern, die den Eigenschaften meiner Klasse entsprechen. – Eric

Antwort

2

Ich sehe keinen Beweis, dass np.save Arrays Unterklassen behandelt.

Ich habe versucht, eine np.matrix damit zu speichern, und erhielt eine ndarray.

Ich versuchte, ein np.ma Array zu speichern, und bekam einen Fehler

NotImplementedError: MaskedArray.tofile() not implemented yet. 

wird Saving von np.lib.npyio.format.write_array getan, die

_write_array_header() # save dtype, shape etc 

tut, wenn dtype Objekt ist es pickle.dump(array, fp ...)

sonst verwendet es tut array.tofile(fp). tofile behandelt das Schreiben des Datenpuffers.

Ich denke, pickle.dump eines Arrays endet mit np.save, aber ich erinnere mich nicht, wie das ausgelöst wird.

ich zum Beispiel kann pickle ein Array ist, und laden Sie es:

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) 

Diese pickle dump/Ladesequenz arbeitet für Test np.ma, np.matrix und sparse.coo_matrix Fälle. Das ist wahrscheinlich die Richtung, die Sie für Ihre eigene Unterklasse erforschen sollten.

Suche auf numpy und pickle Ich fand Preserve custom attributes when pickling subclass of numpy array. Die Antwort beinhaltet eine benutzerdefinierte .__reduce__ und .__setstate__.