HDF5如何处理空行
HDF5 how to handle empty rows
我想将 MOCAP 传感器给出的一些值传递给 hdf5 文件。所以,为了简化事情,假设我有一个 table 就像下一个:
| time | x1 | y1 | x2 | y2 |
| 0 | 2.0 | 1.0 | 2.0 | 3.0 |
| 1 | 2.1 | 1.0 | 2.3 | 3.1 |
| 2 | 2.4 | 1.4 | | |
| 3 | 2.2 | 1.5 | 2.4 | 3.1 |
| 4 | | | 2.3 | 3.2 |
我有一些空白,因为我的传感器在特定时间无法读取特定 body 的信息。所以我的问题是,如何在单个数据集中处理这些空信息?
通过使用 csv 格式,我可以通过不在两个逗号之间写入任何值来忽略这些信息。我正在使用 h5py
和 python。请注意,我有正数和负数。
实际上问题在于,除了将 NaN
放入字段之外,是否还有更好或更合适的方法。
我认为你使用 NaN
是完全正确的。
我会设置一个 fill value 并使用它,在这样做时我会使用 NaN
或 None
。
#!/usr/bin/env python
import numpy as np
import h5py as h5
f = h5.File('test.h5','w')
ctype = np.dtype([('time','i'),
('x1','f8'),('y1','f8'),
('x2','f8'),('y2','f8')])
d = f.create_dataset('test', (5,), dtype=ctype)
d.set_fill_value = np.nan
data = np.array([(0, 2.0, 1.0, 2.0, 3.0),
(1, 2.1, 1.0, 2.3, 3.1),
(2, 2.4, 1.4, np.nan, np.nan),
(3, 2.2, 1.5, 2.4, 3.1),
(4, np.nan, np.nan, 2.3, 3.2)],
dtype = ctype)
d[...] = data
f.close()
然后如果我们 运行 它并查看它生成的文件。
localhost ~$ ./test.py
localhost ~$ h5dump test.h5
h5dump test.h5
HDF5 "test.h5" {
GROUP "/" {
DATASET "test" {
DATATYPE H5T_COMPOUND {
H5T_STD_I32LE "time";
H5T_IEEE_F64LE "x1";
H5T_IEEE_F64LE "y1";
H5T_IEEE_F64LE "x2";
H5T_IEEE_F64LE "y2";
}
DATASPACE SIMPLE { ( 5 ) / ( 5 ) }
DATA {
(0): {
0,
2,
1,
2,
3
},
(1): {
1,
2.1,
1,
2.3,
3.1
},
(2): {
2,
2.4,
1.4,
nan,
nan
},
(3): {
3,
2.2,
1.5,
2.4,
3.1
},
(4): {
4,
nan,
nan,
2.3,
3.2
}
}
}
}
}
当然你不必使用复合数据类型,我只是在你的上下文中这样做了。
我想将 MOCAP 传感器给出的一些值传递给 hdf5 文件。所以,为了简化事情,假设我有一个 table 就像下一个:
| time | x1 | y1 | x2 | y2 |
| 0 | 2.0 | 1.0 | 2.0 | 3.0 |
| 1 | 2.1 | 1.0 | 2.3 | 3.1 |
| 2 | 2.4 | 1.4 | | |
| 3 | 2.2 | 1.5 | 2.4 | 3.1 |
| 4 | | | 2.3 | 3.2 |
我有一些空白,因为我的传感器在特定时间无法读取特定 body 的信息。所以我的问题是,如何在单个数据集中处理这些空信息?
通过使用 csv 格式,我可以通过不在两个逗号之间写入任何值来忽略这些信息。我正在使用 h5py
和 python。请注意,我有正数和负数。
实际上问题在于,除了将 NaN
放入字段之外,是否还有更好或更合适的方法。
我认为你使用 NaN
是完全正确的。
我会设置一个 fill value 并使用它,在这样做时我会使用 NaN
或 None
。
#!/usr/bin/env python
import numpy as np
import h5py as h5
f = h5.File('test.h5','w')
ctype = np.dtype([('time','i'),
('x1','f8'),('y1','f8'),
('x2','f8'),('y2','f8')])
d = f.create_dataset('test', (5,), dtype=ctype)
d.set_fill_value = np.nan
data = np.array([(0, 2.0, 1.0, 2.0, 3.0),
(1, 2.1, 1.0, 2.3, 3.1),
(2, 2.4, 1.4, np.nan, np.nan),
(3, 2.2, 1.5, 2.4, 3.1),
(4, np.nan, np.nan, 2.3, 3.2)],
dtype = ctype)
d[...] = data
f.close()
然后如果我们 运行 它并查看它生成的文件。
localhost ~$ ./test.py
localhost ~$ h5dump test.h5
h5dump test.h5
HDF5 "test.h5" {
GROUP "/" {
DATASET "test" {
DATATYPE H5T_COMPOUND {
H5T_STD_I32LE "time";
H5T_IEEE_F64LE "x1";
H5T_IEEE_F64LE "y1";
H5T_IEEE_F64LE "x2";
H5T_IEEE_F64LE "y2";
}
DATASPACE SIMPLE { ( 5 ) / ( 5 ) }
DATA {
(0): {
0,
2,
1,
2,
3
},
(1): {
1,
2.1,
1,
2.3,
3.1
},
(2): {
2,
2.4,
1.4,
nan,
nan
},
(3): {
3,
2.2,
1.5,
2.4,
3.1
},
(4): {
4,
nan,
nan,
2.3,
3.2
}
}
}
}
}
当然你不必使用复合数据类型,我只是在你的上下文中这样做了。