¿Cómo usar `numpy.savez` en un bucle para guardar más de una matriz?

De un bucle me sale una matriz. Quiero guardar este arrays en un tempfile . El problema es que np.savez solo guarda la última matriz del bucle. Creo que entiendo por qué sucede esto, pero no sé cómo hacerlo mejor.

Para resolver mi problema, tuve la idea de abrir el archivo temporal en mode=a+b con el objective de agregar los nuevos arreglos del ciclo. Pero esto no funciona.

Mi código hasta ahora:

 tmp = TemporaryFile(mode="a+b") for i in range(10): array = getarray[i] #demo purpose np.savez(tmp,array) tmp.seek(0) 

Luego usando el archivo temp para leer las matrices:

 tmp_read = np.load(tmp) print tmp_read.files [OUTPUT]: ['arr_0'] 

Pero quiero 10 matrices en el archivo temporal. ¿Algunas ideas?
Gracias

Puede usar los argumentos *args para guardar muchas matrices en un solo archivo temporal.

 np.savez(tmp, *getarray[:10]) 

o:

 np.savez(tmp, *[getarray[0], getarray[1], getarray[8]]) 

Lo siento por mi inglés por adelantado.

Debido a que la función savez abre el archivo, escribe todas las variables, luego cierra el archivo, los datos se sobrescriben cuando se llama.

savez es simple Puede encontrar el código en https://github.com/numpy/numpy/blob/master/numpy/lib/npyio.py

acerca de cómo implementar “your_own_savez”, luego use el siguiente código.

 tmp = TemporaryFile() f = my_savez(tmp) for i in range(10): array = getarray[i] #demo purpose f.savez(array) f.close() tmp.seek(0) tmp_read = np.load(tmp) print tmp_read.files 

Aquí está mi código rápido y sucio.

 import numpy as np import tempfile class my_savez(object): def __init__(self, file): # Import is postponed to here since zipfile depends on gzip, an optional # component of the so-called standard library. import zipfile # Import deferred for startup time improvement import tempfile import os if isinstance(file, basestring): if not file.endswith('.npz'): file = file + '.npz' compression = zipfile.ZIP_STORED zip = self.zipfile_factory(file, mode="w", compression=compression) # Stage arrays in a temporary file on disk, before writing to zip. fd, tmpfile = tempfile.mkstemp(suffix='-numpy.npy') os.close(fd) self.tmpfile = tmpfile self.zip = zip self.i = 0 def zipfile_factory(self, *args, **kwargs): import zipfile import sys if sys.version_info >= (2, 5): kwargs['allowZip64'] = True return zipfile.ZipFile(*args, **kwargs) def savez(self, *args, **kwds): import os import numpy.lib.format as format namedict = kwds for val in args: key = 'arr_%d' % self.i if key in namedict.keys(): raise ValueError("Cannot use un-named variables and keyword %s" % key) namedict[key] = val self.i += 1 try: for key, val in namedict.iteritems(): fname = key + '.npy' fid = open(self.tmpfile, 'wb') try: format.write_array(fid, np.asanyarray(val)) fid.close() fid = None self.zip.write(self.tmpfile, arcname=fname) finally: if fid: fid.close() finally: os.remove(self.tmpfile) def close(self): self.zip.close() tmp = tempfile.TemporaryFile() f = my_savez(tmp) for i in range(10): array = np.zeros(10) f.savez(array) f.close() tmp.seek(0) tmp_read = np.load(tmp) print tmp_read.files for k, v in tmp_read.iteritems(): print k, v 

No soy un progtwigdor experimentado, pero esta es la forma en que lo hice (en caso de que pueda ayudar a alguien en el futuro). Además, es la primera vez que publico aquí, así que me disculpo si no estoy siguiendo algún tipo de estándar;)

Creando el archivo npz:

 import numpy as np tmp = file("C:\\Windows\\Temp\\temp_npz.npz",'wb') # some variables a= [23,4,67,7] b= ['w','ww','wwww'] c= np.ones((2,6)) # a lit containing the name of your variables var_list=['a','b','c'] # save the npz file with the variables you selected str_exec_save = "np.savez(tmp," for i in range(len(var_list)): str_exec_save += "%s = %s," % (var_list[i],var_list[i]) str_exec_save += ")" exec(str_exec_save) tmp.close 

Cargando las variables con sus nombres originales:

 import numpy as np import tempfile tmp = open("C:\\Windows\\Temp\\temp_npz.npz",'rb') # loading of the saved variables var_load = np.load(tmp) # getting the name of the variables files = var_load.files # loading then with their original names for i in range(len(files)): exec("%s = var_load['%s']" % (files[i],files[i]) ) 

La única diferencia es que las variables se convertirán en variables numpy.

También es posible usar claves personalizadas usando el operador ** .

 import numpy as np a1 = [1,2,3] a2 = [10,20,30] savez_dict = dict() for i in ['a1', 'a2']: savez_dict['key_'+i] = i np.savez("t.npz", **savez_dict)