使用类型"8 位整数数组 (80)"将字符串保存到 h5py 数据集



我希望创建一个h5py的"字符串"数据集(例如"A"),使用数据类型"8位整数数组(80)"(如HDFView所示,请参阅此处)。这个长度为 80 的数组的每个整数实际上是这个字符串的相应字符的ord(x)。例如,Top存储为84 111 112 0 0 0 ...,总共有80int8

所需的数据集应如下所示

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
}
}

那么datadtype需要什么,如果我的字符串是"顶部"。

.create_dataset("NOM", data=data, dtype=dtype)

根据 https://github.com/h5py/h5py/issues/955 的说法,也许我需要使用较低级别的接口...?

谢谢!

溶液

问题是,如果我们使用.create_dataset("NOM", data=data)在编写之前data创建 numpy 数据集,则内部 numpy 将始终将我的80int8数据类型解释为一维数组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,)))

制作一个大小和内容合适的uint8数组:

In [417]: x = np.zeros(80, dtype='uint8')                                                 
In [419]: x[:3]=[ord(i) for i in 'Top']                                                                                                                                
In [421]: ds1=hf.create_dataset('other4', data=x) 

结构化数组方法:

In [486]: dt = np.dtype([('f0','80int8')])                                                
In [487]: dt                                                                              
Out[487]: dtype([('f0', 'i1', (80,))])
In [488]: x = np.zeros(1, dt)                                                             
In [489]: x['f0'][0][:3]=[ord(i) for i in 'Top']                                          
In [490]: x                                                                               
Out[490]: 
array([([ 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],)],
dtype=[('f0', 'i1', (80,))])
In [491]: ds1=hf.create_dataset('st1', data=x)                                            
In [492]: ds1                                                                             
Out[492]: <HDF5 dataset "st1": shape (1,), type "|V80">

生产

DATASET "st1" {
DATATYPE  H5T_COMPOUND {
H5T_ARRAY { [80] H5T_STD_I8LE } "f0";
}
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 ]
}
}
}

相关内容

最新更新