Я хочу создать h5py
набор данных "string" (например, "A"), используя тип данных "массив 8-битных целых (80)" (как показано в HDFView, см. здесь ).Каждое целое число этого массива длиной 80 на самом деле ord(x)
соответствующего символа этой строки.Например, Top
хранится как 84 111 112 0 0 0 ...
, всего 80 int8
.
Требуемый набор данных должен выглядеть следующим образом
DATASET "NOM" {
DATATYPE H5T_ARRAY { [80] H5T_STD_I8LE }
DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
DATA {
(0): [ 84, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
}
Однако я не могу создатьэтот набор данных, используя h5py
.Использование стандартного массива numpy дает это
DATASET "NOM" {
DATATYPE H5T_STD_I8LE
DATASPACE SIMPLE { ( 1, 80 ) / ( 1, 80 ) }
DATA {
(0,0): 84, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(0,15): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(0,31): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(0,47): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(0,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(0,79): 0
}
}
Так что же нужно data
и dtype
, если моя строка, скажем, "Top".
.create_dataset("NOM", data=data, dtype=dtype)
Согласноhttps://github.com/h5py/h5py/issues/955, возможно, мне нужно использовать интерфейс более низкого уровня ...?
Спасибо!
Решение
Проблема заключается в том, что если мы создадим набор данных numpydata
перед записью с использованием .create_dataset("NOM", data=data)
, внутренне numpy всегда будет интерпретировать мой тип данных 80int8
как массив 1d int8
dtype = np.dtype("80int8")
x = np.array(2, dtype=dtype)
# x.dtype = dtype('int8')
Таким образом, решение заключается в объявлении набора данных с помощьюсначала необходимо dtype
, затем заполните данные.
dataset = gro.create_dataset("NOM", (len(nom),), dtype="80int8")
for i in range(len(nom)):
nom_80 = nom[i] + "\x00" * (80 - len(nom[i])) # make nom 80 characters
dataset[i] = [ord(x) for x in nom_80]
# dataset.dtype = dtype(('i1', (80,)))