2017-09-10 3 views
0

Ich versuche, Daten zu .h5 Datei zu speichern. Das Datenformat ist etwas, was wie folgt aus:Speichern von Daten in h5

[(1, array([[ 1., 1., 1., 1.]]), 64, 64), 
(2, array([[ 1., 1., 1., 1.]]), 64, 64), 
(3, array([[ 1., 1., 1., 1.]]), 64, 64), 
(4, array([[ 1., 1., 1., 1.]]), 64, 64)] 

ich diese Störung erhalte: ValueError: setting an array element with a sequence.

Bitte helfen Sie mir, die Daten zu h5 zu speichern.

Code-Snippet:

import numpy as np 
dataA = np.ones((1,4)) 
const1 = 64 
const2 = 64 
my_list = [] 

for i in range(1,5): 
    data = (i,dataA,const1,const2) 
    my_list.append(data) 

#print my_list 

#Saving to h5 
import h5py 
f = h5py.File('sample.h5','a') 
f.create_dataset('data',data=my_list,dtype=np.float32) 
+0

von dem Fehler klingt es wie die Daten, die Sie versuchen, in ein einzelnes Array-Element zu schreiben ist eine Sequenz .. Sie sollten überprüfen Sie Ihre my_list Inhalt und versuchen, es manuell zu debuggen – Vinny

+3

'h5py' kann nur numpy Arrays, nicht Python-Listen . Und es kann auch kein Objekt dtype sein. Es kann strukturierte Arrays verarbeiten. Möglicherweise müssen Sie Ihre Daten als mehrere Arrays statt einer zusammengesetzten speichern. – hpaulj

+0

Danke für die Antwort. Gibt es eine Möglichkeit, dass ich meine Liste auf h5 speichern kann. oder kann ich Liste zu numpy Array – naik3

Antwort

1

Wie ich in einem Kommentar schrieb, h5py Arrays speichert, keine Listen. Also versucht es mit Ihrem Anruf, Ihre Liste in ein Array zu konvertieren:

Dieser Schritt erzeugt den Fehler. Wenn ich nun ein Objekt dtype spezifiziere, kann ich es in ein Array umwandeln, ein (4,4) welches Ganzzahlen und Arrays enthält.

In [647]: np.array(alist, dtype=object) 
Out[647]: 
array([[1, array([[ 1., 1., 1., 1.]]), 64, 64], 
     [2, array([[ 1., 1., 1., 1.]]), 64, 64], 
     [3, array([[ 1., 1., 1., 1.]]), 64, 64], 
     [4, array([[ 1., 1., 1., 1.]]), 64, 64]], dtype=object) 

Aber h5py kann nicht diese Art von Array speichern.

Ich konnte eine strukturierte Anordnung aus dieser Liste machen mit:

In [649]: np.array(alist, dtype='i,4i,i,i') 
Out[649]: 
array([(1, [1, 1, 1, 1], 64, 64), (2, [1, 1, 1, 1], 64, 64), 
     (3, [1, 1, 1, 1], 64, 64), (4, [1, 1, 1, 1], 64, 64)], 
     dtype=[('f0', '<i4'), ('f1', '<i4', (4,)), ('f2', '<i4'), ('f3', '<i4')]) 

Dies geschieht zu arbeiten, weil es sich um eine Liste von Tupeln, ein wichtiges Detail ist. h5py kann man erkennen, sparen:

In [651]: arr = np.array(alist, dtype='i,4i,i,i') 
In [652]: f.create_dataset('alist', data=arr) 
Out[652]: <HDF5 dataset "alist": shape (4,), type "|V28"> 

und ich kann sie sogar wieder in eine Liste von Tupeln lesen und konvertieren:

In [654]: f['alist'][:].tolist() 
Out[654]: 
[(1, array([1, 1, 1, 1]), 64, 64), 
(2, array([1, 1, 1, 1]), 64, 64), 
(3, array([1, 1, 1, 1]), 64, 64), 
(4, array([1, 1, 1, 1]), 64, 64)] 

obwohl öfter ich Name sein Feld ein solches Array zugreifen würde:

In [655]: f['alist']['f1'] 
Out[655]: 
array([[1, 1, 1, 1], 
     [1, 1, 1, 1], 
     [1, 1, 1, 1], 
     [1, 1, 1, 1]]) 

Aber ich frage mich, ob Sie genug wissen numpy, um mit strukturierten Arrays vertraut zu sein. Gibt es einen besonderen Grund, warum Sie die Liste so aufbauen? Es ist nicht besonders nützlich für numpy Stilberechnungen.

Eine weitere Option besteht darin, die Spalten in separaten Arrays zu speichern und diese einzeln zu speichern.

+0

Vielen Dank. – naik3