Сохранение с помощью массивов h5py разных размеров

Я пытаюсь сохранить около 3000 массивов numpy, используя формат данных HDF5. Массивы различаются по длине от 5306 до 121999 np.float64.

Я получаю ошибку Object dtype dtype('O') has no native HDF5 equivalent, так как из-за нерегулярного характера данных numpy использует общий класс объектов.

Моя идея заключалась в том, чтобы дополнить все массивы длиной 121999 и сохранить размеры в другом наборе данных.

Однако это кажется довольно неэффективным в космосе, есть ли лучший способ?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я хочу хранить 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

person Jose Javier Gonzalez Ortiz    schedule 13.05.2016    source источник
comment
Вы пытаетесь сохранить один массив с 3000 подмассивами (с объектом dtype) или 3000 массивов, каждый с dtype float? Приведите небольшой пример с 2 или 3 массивами.   -  person hpaulj    schedule 13.05.2016
comment
Я уточнил это в Edit   -  person Jose Javier Gonzalez Ortiz    schedule 13.05.2016
comment
arrs — это массив объектов, который h5py не может сохранить. Вы должны сохранить a, b, c как отдельные datasets. Эти массивы будут элементами datagroup, и вы сможете использовать интерфейс словаря с группами.   -  person hpaulj    schedule 13.05.2016


Ответы (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])]
person hpaulj    schedule 13.05.2016
comment
привет, не могли бы вы рассказать о k и v? - person Ling; 26.09.2017
comment
Словарь items() создает кортежи из пар key value. - person hpaulj; 27.09.2017

Чистый метод для внутренних массивов переменной длины: 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)

Работает только для одномерных массивов, https://github.com/h5py/h5py/issues/876

person Joshua Lim    schedule 31.03.2018