Сохранение с массивами h5py различных размеров
Я пытаюсь сохранить около 3000 массивов numpy, используя формат данных HDF5. Длина массивов варьируется от 5306 до 121999 НП.float64
Я получаю
Object dtype dtype('O') has no native HDF5 equivalent
ошибка так как из-за нерегулярного характера данных numpy использует общий класс объектов.
Моя идея состояла в том, чтобы заполнить все массивы длиной 121999 и сохранить размеры в другом наборе данных.
Однако это кажется довольно неэффективным в космосе, есть ли лучший способ?
EDIT: чтобы уточнить, я хочу сохранить 3126 массивов dtype = np.float64
. Я храню их в list
, и когда h5py выполняет процедуру, она преобразуется в массив dtype = object
, потому что они имеют разную длину. Чтобы проиллюстрировать это:
a = np.array([0.1,0.2,0.3],dtype=np.float64)
b = np.array([0.1,0.2,0.3,0.4,0.5],dtype=np.float64)
c = np.array([0.1,0.2],dtype=np.float64)
arrs = np.array([a,b,c]) # This is performed inside the h5py call
print(arrs.dtype)
>>> object
print(arrs[0].dtype)
>>> float64
2 ответа:
Похоже, вы пробовали что-то вроде:
In [364]: f=h5py.File('test.hdf5','w') In [365]: grp=f.create_group('alist') In [366]: grp.create_dataset('alist',data=[a,b,c]) ... TypeError: Object dtype dtype('O') has no native HDF5 equivalent
Но если вместо этого вы сохраняете массивы как отдельные наборы данных, это работает:
In [367]: adict=dict(a=a,b=b,c=c) In [368]: for k,v in adict.items(): grp.create_dataset(k,data=v) .....: In [369]: grp Out[369]: <HDF5 group "/alist" (3 members)> In [370]: grp['a'][:] Out[370]: array([ 0.1, 0.2, 0.3])
И для доступа ко всем наборам данных в группе:
In [389]: [i[:] for i in grp.values()] Out[389]: [array([ 0.1, 0.2, 0.3]), array([ 0.1, 0.2, 0.3, 0.4, 0.5]), array([ 0.1, 0.2])]
Чистый метод для внутренних массивов переменной длины: http://docs.h5py.org/en/latest/special.html?highlight=dtype#arbitrary-vlen-data
hdf5_file = h5py.File('yourdataset.hdf5', mode='w') dt = h5py.special_dtype(vlen=np.dtype('float64')) hdf5_file.create_dataset('dataset', (3,), dtype=dt) hdf5_file['dataset'][...] = arrs print (hdf5_file['dataset'][...]) >>>array([array([0.1,0.2,0.3],dtype=np.float64), >>>array([0.1,0.2,0.3,0.4,0.5],dtype=np.float64, >>>array([0.1,0.2],dtype=np.float64], dtype=object)
Работает только для 1D массивов, https://github.com/h5py/h5py/issues/876