#python #version #spyder #h5py #dtype
Вопрос:
Может быть, вопрос глупый, но до сих пор я не смог найти решение. Мне передали код от другого человека, который, вероятно, работал с набором, отличным от моего (например, Python 2 вместо 3 и т. Д.). Поэтому я внес некоторые небольшие изменения, чтобы все работало, но я застрял в, вероятно, простой проблеме, связанной с h5py.
Та часть кода, в которой он разрушается, выглядит так:
labels_ALL = ['ionic_str','psi0','psi1','psi2','psid','zeta','sig0','sig1','sig2','sigd','sig0_eq','sig1_eq','sig2_eq','sigd_eq','ch_bal_EDL','ch_bal_aq', 'sum_resid'] units_ALL = ['(mol/L)','(V)','(V)','(V)','(V)','(V)','(C/m**2)','(C/m**2)','(C/m**2)','(C/m**2)','(mol(eq))','(mol(eq))','(mol(eq))','(mol(eq))','(C/m**2)','(mol(eq)/L)',' '] for i in range(len(Labels)): labels_ALL.append(Labels[i]) units_ALL.append('(mol/L)') base.create_dataset('Labels', data=labels_ALL) base.create_dataset('Units', data=units_ALL)
Проблема, похоже, в base.create_dataset:
Traceback (most recent call last): File "C:UsersDaniJDocumentsPostDoc_JenaTrips, Conf, etcSinfonia WorkshopExercise_1exercise_1_SINFONIA_for_OneNR_chem_SINGLE_NoEu.py", line 252, in lt;modulegt; base.create_dataset('Labels', data=labels_ALL) File "C:UsersDaniJanaconda3libsite-packagesh5py_hlgroup.py", line 136, in create_dataset dsid = dataset.make_new_dset(self, shape, dtype, data, **kwds) File "C:UsersDaniJanaconda3libsite-packagesh5py_hldataset.py", line 118, in make_new_dset tid = h5t.py_create(dtype, logical=1) File "h5pyh5t.pyx", line 1634, in h5py.h5t.py_create File "h5pyh5t.pyx", line 1656, in h5py.h5t.py_create File "h5pyh5t.pyx", line 1717, in h5py.h5t.py_create TypeError: No conversion path for dtype: dtype('lt;U10')
база переменных, по-видимому, представляет собой файлы h5py._hl..Файловая переменная.
Кто-нибудь знает, как я могу решить эту проблему?
Спасибо
С наилучшими пожеланиями, Дэни
Комментарии:
1. Сообщение об ошибке (
No conversion path for dtype: dtype('lt;U10')
) относится к символам Юникода, которые НЕ поддерживаются HDF5 (и h5py). Перед сохранением вам необходимо преобразовать Юникод в байтовые строки. В вашем коде не показано назначениеlabels
значений, поэтому я не могу воспроизвести проблему. Код работает, если я закомментируюfor i in range():
цикл и сохраню только исходные значенияlabels_ALL
units_ALL
наборов данных и в них.2. Метки в основном представляли собой список строк, таких как
Labels = ['H ','Na ','Cl-','OH-','gt;SOH_x','gt;SO-_x','gt;SONa_x','gt;SOH2 _x','gt;SOH2Cl_x','gt;SOH_y','gt;SO-_y','gt;SONa_y']
3. Хммм…не то, что я ожидал
Labels
. 🙁 Вы получитеdtype('lt;U10')
ошибку, еслиLabels
это массив строк NumPy. Ваш код работает так, как ожидалось, когда я добавляю эту строку (и включаюfor
цикл). Я могу воспроизвести ошибку, если преобразую список в массив NumPy.
Ответ №1:
Вы решили свою проблему? Я на 99,9% уверен, что это связано с вашими Labels
данными-скорее всего, они находятся в массиве NumPy, а не в списке. Я написал 3 коротких примера, чтобы продемонстрировать разницу.
- Первый сегмент кода использует список и успешно создает наборы данных в файле
SO_69900543_1.h5
. - Второй сегмент кода воспроизводит вашу ошибку. Он преобразует список в массив NumPy, а затем терпит неудачу при попытке создать наборы данных в файле
SO_69900543_2.h5
. Обратите внимание, что он выдает то же сообщение об ошибке, с которым вы столкнулись:TypeError: No conversion path for dtype: dtype('lt;U10')
. - Третий сегмент кода показывает, как изменить
numpy.str_
элементыstr
(решает проблему в сегменте № 2). Обратите внимание, что каждоеLabels
значение преобразуется сstr()
помощью перед его добавлениемLabels_All
.
Возможно, это поможет вам найти (и устранить) проблему с данными в Юникоде.
Сегмент 1 кода (работает):
Labels = ['H ','Na ','Cl-','OH-','gt;SOH_x','gt;SO-_x','gt;SONa_x','gt;SOH2 _x','gt;SOH2Cl_x','gt;SOH_y','gt;SO-_y','gt;SONa_y'] labels_ALL = ['ionic_str','psi0','psi1','psi2','psid','zeta','sig0','sig1','sig2','sigd','sig0_eq','sig1_eq','sig2_eq','sigd_eq','ch_bal_EDL','ch_bal_aq', 'sum_resid'] units_ALL = ['(mol/L)','(V)','(V)','(V)','(V)','(V)','(C/m**2)','(C/m**2)','(C/m**2)','(C/m**2)','(mol(eq))','(mol(eq))','(mol(eq))','(mol(eq))','(C/m**2)','(mol(eq)/L)',' '] for i in range(len(Labels)): labels_ALL.append(Labels[i]) units_ALL.append('(mol/L)') with h5py.File('SO_69900543_1.h5','w') as base: base.create_dataset('Labels', data=labels_ALL) base.create_dataset('Units', data=units_ALL)
Сегмент кода 2 (возвращает ошибку типа):
Labels = ['H ','Na ','Cl-','OH-','gt;SOH_x','gt;SO-_x','gt;SONa_x','gt;SOH2 _x','gt;SOH2Cl_x','gt;SOH_y','gt;SO-_y','gt;SONa_y'] # Convert Labels List to NumPy array # This will trigger the error when creating the dataset Labels = np.array(Labels) labels_ALL = ['ionic_str','psi0','psi1','psi2','psid','zeta','sig0','sig1','sig2','sigd','sig0_eq','sig1_eq','sig2_eq','sigd_eq','ch_bal_EDL','ch_bal_aq', 'sum_resid'] units_ALL = ['(mol/L)','(V)','(V)','(V)','(V)','(V)','(C/m**2)','(C/m**2)','(C/m**2)','(C/m**2)','(mol(eq))','(mol(eq))','(mol(eq))','(mol(eq))','(C/m**2)','(mol(eq)/L)',' '] for i in range(len(Labels)): labels_ALL.append(Labels[i]) units_ALL.append('(mol/L)') for i in range(len(labels_ALL)): print(i, type(labels_ALL[i]), type(units_ALL[i])) with h5py.File('SO_69900543_2.h5','w') as base: base.create_dataset('Labels', data=labels_ALL) base.create_dataset('Units', data=units_ALL)
Сегмент кода 3 (работает):
Labels = ['H ','Na ','Cl-','OH-','gt;SOH_x','gt;SO-_x','gt;SONa_x','gt;SOH2 _x','gt;SOH2Cl_x','gt;SOH_y','gt;SO-_y','gt;SONa_y'] # Convert Labels List to NumPy array # This will trigger the error when creating the dataset if not modified Labels = np.array(Labels) labels_ALL = ['ionic_str','psi0','psi1','psi2','psid','zeta','sig0','sig1','sig2','sigd','sig0_eq','sig1_eq','sig2_eq','sigd_eq','ch_bal_EDL','ch_bal_aq', 'sum_resid'] units_ALL = ['(mol/L)','(V)','(V)','(V)','(V)','(V)','(C/m**2)','(C/m**2)','(C/m**2)','(C/m**2)','(mol(eq))','(mol(eq))','(mol(eq))','(mol(eq))','(C/m**2)','(mol(eq)/L)',' '] for i in range(len(Labels)): # use str() to convert from 'numpy.str_' to 'str' labels_ALL.append(str(Labels[i])) units_ALL.append('(mol/L)') for i in range(len(labels_ALL)): print(i, type(labels_ALL[i]), type(units_ALL[i])) with h5py.File('SO_69900543_2.h5','w') as base: base.create_dataset('Labels', data=labels_ALL) base.create_dataset('Units', data=units_ALL)
Комментарии:
1. Спасибо, это прекрасно!!
2. Привет, Дэниел. Рад, что это помогло. Если это решило вашу проблему, пожалуйста, проверьте Принятый ответ, чтобы указать, что это решение. С уважением.