2010-06-16 12 views
2

Je voudrais stocker et charger des tableaux numpy à partir de fichiers binaires. Pour ce faire, j'ai créé deux petites fonctions. Chaque fichier binaire doit contenir la dimensionnalité de la matrice donnée.stocker/charger un tableau numpy à partir de fichiers binaires

def saveArrayToFile(data, fileName): 
    with open(fileName, 'w') as file: 
     a = array.array('f') 
     nSamples, ndim = data.shape 
     a.extend([nSamples, ndim]) # write number of elements and dimensions 
     a.fromstring(data.tostring()) 
     a.tofile(file) 


def readArrayFromFile(fileName): 
    _featDesc = np.fromfile(fileName, 'f') 
    _ndesc = int(_featDesc[0]) 
    _ndim = int(_featDesc[1]) 
    _featDesc = _featDesc[2:] 
    _featDesc = _featDesc.reshape([_ndesc, _ndim]) 

    return _featDesc, _ndesc, _ndim 

Un exemple sur la façon d'utiliser les fonctions est:

myarr=np.array([[7, 4],[3, 9],[1, 3]]) 
saveArrayToFile(myarr,'myfile.txt') 
_featDesc, _ndesc, _ndim = readArrayFromFile('myfile.txt') 

Cependant, un message d'erreur de « ValueError: la taille totale du nouveau tableau doit être inchangé » est affiché. Mes tableaux peuvent être de taille MxN et MxM. Toutes les suggestions sont plus que bienvenues. Je pense que le problème pourrait être dans la fonction saveArrayToFile.

Meilleurs voeux,

Javier

Répondre

2

Utilisez numpy.save (et numpy.load) à benne (Retrieve) Les tableaux NumPy à (de) un fichier binaire.

+0

OK, merci! Cependant, j'ai vraiment besoin de stocker la dimension MxN du tableau dans le fichier. – Javier

+0

Serait-il suffisant de nommer le fichier quelque chose comme 'myfile_MxN.npy'? – unutbu

+1

@Javier: Je pourrais comprendre pourquoi vous pourriez vouloir sauvegarder la dimension du tableau en disant les premiers octets du fichier si vous vouliez saisir ces données sans lire le fichier entier. Cependant, '_featDesc, _ndesc, _ndim = readArrayFromFile ('myfile.txt')' suggère que vous êtes en train de lire le fichier entier (sans jeter un coup d'œil sur les bits d'en-tête). Alors pourquoi ne pas simplement utiliser 'arr = np.load (...)', puis '_esc, _ndim = arr.shape'? – unutbu

Questions connexes