У меня есть 2d-список (Data_set), который содержит 3d-массив и метку (0 или 1), я хочу сделать файл h5py с двумя наборами данных один для трехмерного массива, а другой для метки, это мой код для этого: '
data = []
label = []
for i in range(len(Data_set)):
data.append(Data_set[i][0])# 3d array
label.append(Data_set[i][1])#label
data = np.array(data)
label = np.array(label)
dt = np.dtype('int16')
with h5py.File(output_path+'dataset.h5', 'w') as hf:
hf.create_dataset('data',dtype=dt ,data=data, compression='lzf')
hf.create_dataset('label', dtype=dt, data=label, compression='lzf')
'содержимое списка 2d показано на рисунке ниже: , но когда я запускаю код, он дает мне ошибку: см. изображение ниже , пожалуйста, помогите мне решить проблему?
Ваши метки не являются целыми числами, они являются строками, что является проблемой для HDF5. Ваше сообщение об ошибке относится к массиву, состоящему из строк длины 1. Для получения более подробной информации см. Строки в HDF5.
Вы можете преобразовать в целые числа до или после создания вашего массива NumPy, вот несколько примеров:
label = np.array(label).astype(int)
# or, label = np.array(list(map(int, label)))
В качестве альтернативы, поскольку ваши значения равны 0
или 1
, выбор bool
может быть более эффективным:
label = np.array(label).astype(int).astype(bool)
Кроме того, рассмотрите возможность хранения метаданных в качестве атрибутов.
data
вам не нужно устанавливатьdtyoe
. Это может сделать вывод изdata
собственного dtype.label.astype('S1')
также работает - он может сохранять строки байтов, но не в Unicode (по умолчанию для PY3), по крайней мере, напрямую.