Ваш код работает для меня (в сеансе i python):
In [1]: import h5py
In [2]: h5_file_name = 'sample.h5'
...: hf = h5py.File(h5_file_name, 'w')
...: g1 = hf.create_group('Objects')
...: dt = h5py.special_dtype(vlen=str)
...: d1 = g1.create_dataset('D1', (2, 10), dtype=dt)
...: d2 = g1.create_dataset('D2', (3, 10), dtype=dt)
...: for i in range(10):
...: d1[0][i] = 'Sample'
...: d1[1][i] = str(i)
...: d2[0][i] = 'Hello'
...: d2[1][i] = 'World'
...: d2[2][i] = str(i)
...: hf.close()
Запускается и создает файл. Это не "пусто" в обычном смысле. Но если файл пуст, вы имеете в виду, что он не записал слова в файл? Все, что присутствует, это оригинальный ''
.
In [4]: hf = h5py.File(h5_file_name, 'r')
In [5]: hf['Objects/D1']
Out[5]: <HDF5 dataset "D1": shape (2, 10), type "|O">
In [6]: hf['Objects/D1'][:]
Out[6]:
array([['', '', '', '', '', '', '', '', '', ''],
['', '', '', '', '', '', '', '', '', '']], dtype=object)
===
Проблема не в настройке файла, а в том, как вы пытаетесь установить элементы:
In [45]: h5_file_name = 'sample.h5'
...: hf = h5py.File(h5_file_name, 'w')
...: g1 = hf.create_group('Objects')
...: dt = h5py.special_dtype(vlen=str)
...: d1 = g1.create_dataset('D1', (2, 10), dtype=dt)
...: d2 = g1.create_dataset('D2', (3, 10), dtype=dt)
...:
In [46]: d1[:]
Out[46]:
array([['', '', '', '', '', '', '', '', '', ''],
['', '', '', '', '', '', '', '', '', '']], dtype=object)
In [47]: d1[0][0] = 'sample'
In [48]: d1[:]
Out[48]:
array([['', '', '', '', '', '', '', '', '', ''],
['', '', '', '', '', '', '', '', '', '']], dtype=object)
Используйте стиль индексации tuple
:
In [49]: d1[0, 0] = 'sample'
In [50]: d1[:]
Out[50]:
array([['sample', '', '', '', '', '', '', '', '', ''],
['', '', '', '', '', '', '', '', '', '']], dtype=object)
С массивом numpy 1017 * работает, но это потому, что d1[0]
является view
из d1
, но h5py
(по-видимому) не совсем повторяет это. d1[0]
- это копия, фактический массив numpy, а не сам набор данных.
Вариации индексации всего массива:
In [51]: d1[0, :] = 'sample'
In [52]: d1[1, :] = np.arange(10)
In [53]: d1[:]
Out[53]:
array([['sample', 'sample', 'sample', 'sample', 'sample', 'sample',
'sample', 'sample', 'sample', 'sample'],
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']], dtype=object)
In [54]: d2[:,0] = ['one','two','three']
In [55]: d2[:]
Out[55]:
array([['one', '', '', '', '', '', '', '', '', ''],
['two', '', '', '', '', '', '', '', '', ''],
['three', '', '', '', '', '', '', '', '', '']], dtype=object)
Проверка изменения типа с помощью индексации:
In [64]: type(d1)
Out[64]: h5py._hl.dataset.Dataset
In [65]: type(d1[0])
Out[65]: numpy.ndarray
d1[0][0]='foobar'
изменит этот массив d1[0]
без влияния на набор данных d1
.