如何使用 h5py 为每个 HDF5 列定义单独的数据类型
How to define an individual data type for each HDF5 column with h5py
我检查了不同的解决方案,但无法理解如何将它们应用于多维数组。准确地说,我的代码生成了一个比应有的更大的数组,如下图所示:
import h5py
import pandas as pd
import numpy as np
data = [[1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861]]
df = pd.DataFrame(data)
hf = h5py.File('dtype.h5', 'w')
dataTypes = np.dtype([('ts', 'u8'), ('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('temp', 'f4')])
ds = hf.create_dataset('Acceleration', data=df.astype(dataTypes))
我想这样做,列分别是 uint64、4x float32:
ts x y z temp
0 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
3 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
4 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
5 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
6 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
7 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
8 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
9 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
你的df
:
In [370]: df
Out[370]:
0 1 2 3 4
0 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
3 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
...
df.astype(dataTypes)
给我 TypeError
(我的 pd
不是最新的)。
In [373]: df.to_records()
Out[373]:
rec.array([(0, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(1, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(2, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(3, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(4, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(5, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(6, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(7, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(8, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(9, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821)],
dtype=[('index', '<i8'), ('0', '<i8'), ('1', '<f8'), ('2', '<f8'), ('3', '<f8'), ('4', '<f8')])
此数组应保存为 h5py
。
to_records
的参数可能会创建更接近您的 dataTypes
的内容。我会让你探索那些。
但是通过最新的重组 a recfunctions
,我们可以制作一个结构化数组:
In [385]: import numpy.lib.recfunctions as rf
In [386]: rf.unstructured_to_structured(np.array(data), dataTypes)
Out[386]:
array([(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898)],
dtype=[('ts', '<u8'), ('x', '<f4'), ('y', '<f4'), ('z', '<f4'), ('temp', '<f4')])
np.array(data)
是 (10,5) 浮点数组。
In [388]: pd.DataFrame(_386)
Out[388]:
ts x y z temp
0 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
...
这个问题比最初看起来要棘手。最初,我认为我可以应用与我对您上一个问题的回答相同的方法 。但是,它有一些细微的差别:
- 此数据是一个列表列表 VS 一个 5x5 NumPy 数组
- 此数据是混合类型(整数和浮点数)VS 所有浮点数
- 这个数据比前面的例子有更多的有效数字
这个程序怎么改?
- List of Lists 可以转换为 NumPy 数组
np.array(data)
然而,这并不能完全解决问题。您仍然会得到重复的列。
- 您还需要更改数据类型声明中的对象类型。
f4
需要f8
,u8
需要uint16
进行这些更改,一切都像我之前的回答一样。请参阅下面对原始代码的更新。
dataTypes = np.dtype([('ts', 'uint16'), ('x', 'f8'),
('y', 'f8'), ('z', 'f8'), ('temp', 'f8')])
# create array from list of lists
d_arr = np.array(data)
# create record array
rec_arr = np.rec.array(d_arr, dtype=dataTypes)
with h5py.File('dtype.h5', 'w') as hf:
ds = hf.create_dataset('Acceleration', data=rec_arr)
我检查了不同的解决方案,但无法理解如何将它们应用于多维数组。准确地说,我的代码生成了一个比应有的更大的数组,如下图所示:
import h5py
import pandas as pd
import numpy as np
data = [[1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861], [1583663558450195, -7.063664436340332, -6.2776079177856445, -4.206898212432861, -4.206898212432861]]
df = pd.DataFrame(data)
hf = h5py.File('dtype.h5', 'w')
dataTypes = np.dtype([('ts', 'u8'), ('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('temp', 'f4')])
ds = hf.create_dataset('Acceleration', data=df.astype(dataTypes))
我想这样做,列分别是 uint64、4x float32:
ts x y z temp
0 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
3 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
4 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
5 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
6 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
7 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
8 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
9 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
你的df
:
In [370]: df
Out[370]:
0 1 2 3 4
0 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
3 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
...
df.astype(dataTypes)
给我 TypeError
(我的 pd
不是最新的)。
In [373]: df.to_records()
Out[373]:
rec.array([(0, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(1, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(2, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(3, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(4, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(5, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(6, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(7, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(8, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821),
(9, 1583663558450195, -7.06366444, -6.27760792, -4.20689821, -4.20689821)],
dtype=[('index', '<i8'), ('0', '<i8'), ('1', '<f8'), ('2', '<f8'), ('3', '<f8'), ('4', '<f8')])
此数组应保存为 h5py
。
to_records
的参数可能会创建更接近您的 dataTypes
的内容。我会让你探索那些。
但是通过最新的重组 a recfunctions
,我们可以制作一个结构化数组:
In [385]: import numpy.lib.recfunctions as rf
In [386]: rf.unstructured_to_structured(np.array(data), dataTypes)
Out[386]:
array([(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898),
(1583663558450195, -7.0636644, -6.277608, -4.206898, -4.206898)],
dtype=[('ts', '<u8'), ('x', '<f4'), ('y', '<f4'), ('z', '<f4'), ('temp', '<f4')])
np.array(data)
是 (10,5) 浮点数组。
In [388]: pd.DataFrame(_386)
Out[388]:
ts x y z temp
0 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
1 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
2 1583663558450195 -7.063664 -6.277608 -4.206898 -4.206898
...
这个问题比最初看起来要棘手。最初,我认为我可以应用与我对您上一个问题的回答相同的方法
- 此数据是一个列表列表 VS 一个 5x5 NumPy 数组
- 此数据是混合类型(整数和浮点数)VS 所有浮点数
- 这个数据比前面的例子有更多的有效数字
这个程序怎么改?
- List of Lists 可以转换为 NumPy 数组
np.array(data)
然而,这并不能完全解决问题。您仍然会得到重复的列。 - 您还需要更改数据类型声明中的对象类型。
f4
需要f8
,u8
需要uint16
进行这些更改,一切都像我之前的回答一样。请参阅下面对原始代码的更新。
dataTypes = np.dtype([('ts', 'uint16'), ('x', 'f8'),
('y', 'f8'), ('z', 'f8'), ('temp', 'f8')])
# create array from list of lists
d_arr = np.array(data)
# create record array
rec_arr = np.rec.array(d_arr, dtype=dataTypes)
with h5py.File('dtype.h5', 'w') as hf:
ds = hf.create_dataset('Acceleration', data=rec_arr)