2017-07-25 1 views
1

J'essaie de créer un jeu de données redimensionnable dans h5py. valeurs initiales écrites dans, puis mis à jour avec des valeurs supplémentaires lorsqu'ils sont disponibles quand j'essaie ceci:.Erreur lors de la tentative d'extension d'un jeu de données existant dans h5py: ValueError: Impossible de définir l'extension de jeu de données (Dimension ne peut pas dépasser la taille maximale existante

ds = g2.create_dataset(wf, maxshape=(None), chunks=True, data=values) 
size = ds.shape[0] + len(values) 
ds.resize(size, axis=0) 

Je reçois cette erreur:

ValueError: Unable to set extend dataset (Dimension cannot exceed the existing maximal size (new: 120 max: 60))

Cependant, il semble que la fourniture de données ou les paramètres la forme remplace la maxshape et l'ensemble de données ne se redimensionne pas, avec le message que la forme maximale actuelle est soit celle des données initialement fournies, soit définie dans l'attribut shape.

Selon le h5py documentation c'est exactement comment cela devrait être fait, et en définissant la maxshape à None devrait fournir les extensions illimitées, alors que le réglage des morceaux à True devrait permettre la détermination automatique de la taille du segment.

J'ai aussi essayé quelque chose comme ça, et ajouter des données séparément:

ds = g2.create_dataset(wf,(100,), maxshape=(None), chunks=True, dtype='i') 

Il jette la même erreur, et maintenant je ne sais pas si je suis en train de dimensions de manière incorrecte ou si elle a quelque chose à voir avec le type ou la forme de données.

+0

Je pense que vous devez redimensionner pour ajouter du nouveau matériel. N'y at-il pas quelque chose à ce sujet dans les docs https://stackoverflow.com/questions/40062770/adding-data-to-existing-h5py-file-along-new-axis-using-h5py – hpaulj

+0

Je redimensionne, mais est le problème, il ne veut pas accepter la nouvelle taille car il semble que maxshape a été défini à la taille des données initiales, pas celle définie dans la variable maxshape. Merci pour l'information, je n'ai pas trouvé ce poste avant. – TeilaRei

Répondre

0

La seule chose que je fais différente est d'utiliser (None,) pour la forme, pas (None); c'est s'assurer que je lui donne une forme de tuple. Je n'ai pas essayé sans la virgule.

In [177]: f=h5py.File('test1.h5','w') 
In [178]: ds = f.create_dataset('name', maxshape=(None,), chunks=True, data=np.arange(10)) 
In [179]: ds.shape 
Out[179]: (10,) 
In [180]: ds.resize((20,)) 
In [181]: ds[:] 
Out[181]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 
In [182]: ds[10:]=np.arange(10,20) 
In [183]: ds[:] 
Out[183]: 
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
     17, 18, 19]) 

maxshape doit être un tuple. resize ne fonctionne pas avec (None).

+0

En attendant, j'ai essayé la même chose et ça a marché. J'ai également mis à jour mon h5py à 2.7.xx (plus tard). Je ne sais pas si différentes versions ont quelque chose à voir avec ça ou non, mais maintenant ça marche. – TeilaRei