Comportamiento inexplicable al usar vlen con h5py

Estoy usando h5py para construir un conjunto de datos. Dado que quiero almacenar matrices con diferentes dimensiones de filas #of, utilizo el tipo de archivo h5py special_type vlen. Sin embargo, experimento un comportamiento que no puedo explicar, tal vez pueda ayudarme a comprender lo que está sucediendo:

>>>> import h5py >>>> import numpy as np >>>> fp = h5py.File(datasource_fname, mode='w') >>>> dt = h5py.special_dtype(vlen=np.dtype('float32')) >>>> train_targets = fp.create_dataset('target_sequence', shape=(9549, 5,), dtype=dt) >>>> test Out[130]: array([[ 0., 1., 1., 1., 0., 1., 1., 0., 1., 0., 0.], [ 1., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.]]) >>>> train_targets[0] = test >>>> train_targets[0] Out[138]: array([ array([ 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 1.], dtype=float32), array([ 1., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0.], dtype=float32), array([ 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], dtype=float32), array([ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0.], dtype=float32), array([ 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0.], dtype=float32)], dtype=object) 

Espero que train_targets[0] tenga esta forma, sin embargo no puedo reconocer las filas de mi matriz. Parece que están totalmente revueltos, sin embargo, es consistente. Con esto quiero decir que cada vez que bash el código anterior, train_targets[0] ve igual.

Para aclarar: el primer elemento en mi train_targets , en esta test caso, tiene forma (5,11) , sin embargo, el segundo elemento podría tener forma (5,38) por eso uso vlen.

Gracias por tu ayuda

Estera

Yo creo que

 train_targets[0] = test 

ha almacenado su matriz (11,5) como una matriz ordenada por F en una fila de train_targets . Según la forma (9549,5) , es una fila de 5 elementos. Y como es vlen , cada elemento es una matriz 1d de longitud 11.

Eso es lo que obtiene en train_targets[0] : una matriz de 5 arreglos, cada forma (11,) , con valores tomados de la test (orden F).

Así que creo que hay 2 problemas: lo que significa una forma 2D y lo que permite vlen.


Mi versión de h5py es anterior a la v2.3, así que solo obtengo la cadena vlen. Pero sospecho que su problema puede ser que vlen solo funciona con arreglos 1d, una extensión, por así decirlo, de cadenas de bytes.

¿El 5 en shape=(9549, 5,) tiene algo que ver con 5 en la test.shape ? No creo que lo haga, al menos no como lo numpy y h5py .

Cuando hago un archivo siguiendo el ejemplo de cadena vlen:

 >>> f = h5py.File('foo.hdf5') >>> dt = h5py.special_dtype(vlen=str) >>> ds = f.create_dataset('VLDS', (100,100), dtype=dt) 

y luego hacer:

 ds[0]='this one string' 

y mirando ds[0] , obtengo una matriz de objetos con 100 elementos, cada uno de los cuales es esta cadena. Es decir, he puesto toda una fila de ds .

 ds[0,0]='another' 

Es la forma correcta de configurar un solo elemento.

vlen es ‘longitud variable’, no ‘forma variable’. Si bien la documentación https://www.hdfgroup.org/HDF5/doc/TechNotes/VLTypes.html no es del todo clara, creo que puede almacenar matrices 1d con forma (11,) y (38,) con vlen , pero no los 2d


En realidad, la salida de train_targets se reproduce con:

 In [54]: test1=np.empty((5,),dtype=object) In [55]: for i in range(5): test1[i]=test.T.flatten()[i:i+11] 

Son 11 valores tomados de la transposición (orden F), pero desplazados para cada sub matriz.