2012-06-27 25 views
5

Supongamos que mi programa crea una gran cantidad de datos que luego guardo con la rutina de guardado numpy. Sin embargo, también me gustaría almacenar información adicional junto con esa matriz. Algunos ejemplos serían la ID de confirmación de git de la versión actual y los parámetros de entrada utilizados para generar los datos, de modo que más adelante pueda ver los datos y saber exactamente cómo lo creé.¿Puedo anotar una matriz numpy cuando la guardo con savez

¿Hay alguna manera de guardar esta información directamente junto con la matriz en un archivo npz, o tendría que crear un archivo por separado?

Respuesta

4

Usted debe ser capaz de:

In [2]: a = np.arange(10) 

In [3]: b = 'git push' 

In [5]: np.savez('file',a=a,b=b) 

In [7]: data = np.load('file.npz') 

In [8]: data.keys() 
Out[8]: ['a', 'b'] 

In [9]: data['a'] 
Out[9]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [10]: str(data['b']) 
Out[10]: 'git push' 

para que pueda guardar datos con nombre arbitrarias y obtener un objeto de diccionario parecido a cabo. Tal vez un formato mejor usar que puede ser más flexible y tiene soporte para todo tipo de metadatos es hdf5 utilizando h5py o PyTables:

http://h5py.alfven.org/docs/

http://www.pytables.org/

+0

Ah, se añadió la sugerencia HDF justo cuando estaba terminando mi respuesta! Dejaré la mía también, así como tiene un ejemplo de usar 'h5py'. Buena respuesta, sin embargo. –

+0

Encontré su respuesta y la de Joe Kington muy útil. No pude decidir cuál aceptar, así que tomé el tuyo porque fuiste el primero :) – Lagerbaer

7

En pocas palabras, puede (.npz es solo un dict en escabeche), pero es probable que sea mejor cambiar a otra cosa. (Parece que @JoshAdel acaba de publicar un buen ejemplo de esto si quieres seguir con .npz.)

HDF es una opción mucho mejor para algo como esto.

Cada grupo o conjunto de datos en un archivo hdf puede almacenar atributos.

Recomendaría h5py para almacenar matrices numpy en un archivo hdf.

A modo de ejemplo:

import numpy as np 
import h5py 

somearray = np.random.random(100) 

f = h5py.File('test.hdf', 'w') 

dataset = f.create_dataset('my_data', data=somearray) 

# Store attributes about your dataset using dictionary-like access 
dataset.attrs['git id'] = 'yay this is a string' 

f.close() 
+0

+1 Uso h5py mucho en mi investigación. Tengo mucha menos experiencia con pytables, aunque conozco a mucha gente que lo usa. – JoshAdel

+0

Esto es muy útil JoshAdel. ¿Hay algún límite en el tamaño de estos atributos? –

Cuestiones relacionadas