проблема, связанная с h5py и create_dataset

#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 коротких примера, чтобы продемонстрировать разницу.

  1. Первый сегмент кода использует список и успешно создает наборы данных в файле SO_69900543_1.h5 .
  2. Второй сегмент кода воспроизводит вашу ошибку. Он преобразует список в массив NumPy, а затем терпит неудачу при попытке создать наборы данных в файле SO_69900543_2.h5 . Обратите внимание, что он выдает то же сообщение об ошибке, с которым вы столкнулись: TypeError: No conversion path for dtype: dtype('lt;U10') .
  3. Третий сегмент кода показывает, как изменить 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. Привет, Дэниел. Рад, что это помогло. Если это решило вашу проблему, пожалуйста, проверьте Принятый ответ, чтобы указать, что это решение. С уважением.