2015-05-21 11 views
14

Ist es möglich, ein numpy Array zu speichern, das es an eine bereits existierende npy-Datei anhängt --- so etwas wie np.save(filename,arr,mode='a')?numpy Array im Append-Modus speichern

Ich habe mehrere Funktionen, die über die Zeilen eines großen Arrays durchlaufen müssen. Ich kann das Array wegen Speicherbeschränkungen nicht sofort erstellen. Um zu vermeiden, dass die Zeilen immer wieder neu erstellt werden, wollte ich jede Zeile einmal erstellen und in der Datei speichern, um sie an die vorherige Zeile in der Datei anzuhängen. Später konnte ich die npy-Datei in mmap_mode laden und bei Bedarf auf die Slices zugreifen.

Antwort

8

Das eingebaute .npy Dateiformat ist perfekt für die Arbeit mit kleinen Datensätzen, ohne auf externe Module angewiesen zu sein, außer numpy.

Wenn Sie jedoch mit großen Datenmengen beginnen, ist die Verwendung eines Dateiformats wie HDF5, das für die Verarbeitung solcher Datensätze ausgelegt ist, zu bevorzugen [1].

Zum Beispiel ist eine Lösung numpy Arrays in HDF5 mit PyTables,

Schritt 1 zu speichern: Erstellen eines ausfahrbaren EArray Speicher

import tables 
import numpy as np 

filename = 'outarray.h5' 
ROW_SIZE = 100 
NUM_COLUMNS = 200 

f = tables.open_file(filename, mode='w') 
atom = tables.Float64Atom() 

array_c = f.create_earray(f.root, 'data', atom, (0, ROW_SIZE)) 

for idx in range(NUM_COLUMNS): 
    x = np.random.rand(1, ROW_SIZE) 
    array_c.append(x) 
f.close() 

Schritt 2: Anfügen Zeilen einer bestehenden Datensatz (falls benötigt)

f = tables.open_file(filename, mode='a') 
f.root.data.append(x) 

Schritt 3:

f_handle = file(filename, 'a') numpy.save(f_handle, arr) f_handle.close() 

ich, dass es überprüft

: Lesen Sie eine Teilmenge der Daten

f = tables.open_file(filename, mode='r') 
print(f.root.data[1:10,2:20]) # e.g. read from disk only this part of the dataset 
+3

Dank für mich zu PyTables zeigen. Ein etwas einfacherer Ansatz mit der Array-Klasse war für meinen Zweck ausreichend. Ich bin gespannt, warum es für 'np.save' keinen Append-Modus gibt. Wenn es vernünftig wäre, wäre es wahrscheinlich umgesetzt worden. – user3820991

+0

Ist dies immer noch die beste Methode im Jahr 2018? – Moondra

3

Für Daten an eine bereits bestehende Datei mit numpy.save anhängt, sollten wir verwenden zurück arbeitet in python 2.7 und numpy 1.10.4

ich den Code here

+3

Ich habe nur überprüft und es funktioniert nicht in 'Python 2.7.12' und' numpy 1.12.1'. Das Array bleibt einfach gleich, nichts wird angehängt.Beachten Sie auch, dass der von Ihnen angegebene Link über die 'savetxt'-Methode und nicht über' np.save' spricht. –

+1

Ich konnte diese Art von Stapelmuster erfolgreich mit Python 3.5 und numpy 1.11.3 verwenden. Obwohl es notwendig war, die Datei im Binärmodus zu öffnen. – PaxRomana99

0

gefundenDateien enthalten einen Header, der die Form und den Typ des Arrays enthält. Wenn Sie wissen, wie das resultierende Array aussieht, können Sie den Header selbst und dann die Daten in Blöcken schreiben. Zum Beispiel, hier ist der Code für verketten 2d Matrizen:

import numpy as np 
import numpy.lib.format as fmt 

def get_header(fnames): 
    dtype = None 
    shape_0 = 0 
    shape_1 = None 
    for i, fname in enumerate(fnames): 
     m = np.load(fname, mmap_mode='r') # mmap so we read only header really fast 
     if i == 0: 
      dtype = m.dtype 
      shape_1 = m.shape[1] 
     else: 
      assert m.dtype == dtype 
      assert m.shape[1] == shape_1 
     shape_0 += m.shape[0] 
    return {'descr': fmt.dtype_to_descr(dtype), 'fortran_order': False, 'shape': (shape_0, shape_1)} 

def concatenate(res_fname, input_fnames): 
    header = get_header(input_fnames) 
    with open(res_fname, 'wb') as f: 
     fmt.write_array_header_2_0(f, header) 
     for fname in input_fnames: 
      m = np.load(fname) 
      f.write(m.tostring('C')) 

Wenn Sie eine allgemeine Lösung (edit-Header in der richtigen Stelle während des Anhängen) müssen Sie wie in zu fseek Tricks zurückgreifen müssen [1].

Inspiriert von
[1]: https://mail.scipy.org/pipermail/numpy-discussion/2009-August/044570.html (funktioniert nicht aus dem Kasten)
[2]: https://docs.scipy.org/doc/numpy/neps/npy-format.html
[3]: https://github.com/numpy/numpy/blob/master/numpy/lib/format.py