我正在尝试从 hdf5 文件中读取数据 - 我之前使用 recarray 保存到它。一行数据的类型如下:2x u2(flags) 后跟 2x u4(timestamps) 和 32x u2(data)。
self.flags = np.empty((self.size, 2), dtype="u2")
self.t0 = np.empty(self.size, dtype="u4")
self.t1 = np.empty(self.size, dtype="u4")
self.data = np.empty((self.size, 32), dtype="u2")
...
labels = ['lost events','overwritten events', 't0', 't1'] + ["data_{0}".format(i) for i in range(32)]
result_arr = np.rec.fromarrays(tuple(self.flags.T)+(self.t0, self.t1) + tuple(self.data.T), names=labels)
file.create_dataset('dataset_name', data=result_arr)
现在我想逐行迭代这个文件的一部分(数据部分 - 最后 32 列),并能够像通常的 numpy.array 一样处理它。
data = self.dataset[row_n]
def parseDataToFlags(data):
return np.array(list(data)[4:36], dtype="u2")
这是有效的,但非常缓慢。我正在寻找一种正确的方法来执行此操作,因为我将处理大数据文件。我也试图弄乱这个:(self.dataset 是从文件加载的 h5py 数据集)
def get(self, index):
if not (0 <= index < self.n_of_rows):
raise IndexError
return type(self.dataset['t0', 't1'][index])
但是当我尝试将 [data_{0}".format(i) for i in range(32)] 代替't0','t1'时它失败了。
我做了几次尝试将数据解析为结构化数组,但到目前为止没有运气。
我应该如何正确尝试阅读过程?我应该更改访问顺序(行前的列)还是有办法在读取行后将这些数据解析为正确的类型?
更新我得到了一些帮助,结果是这样的:我的代码中这么慢的不是为每一行创建列表和解析为 numpy 数组。访问 h5py 文件中的数据是。所以最好一次访问它并一次解析它们。
self.flags = np.vstack((self.dataset['lost events'], self.dataset['overwritten events'])).T
self.time = np.vstack((self.dataset['t0'], self.dataset['t1'])).T
self.output = np.vstack([self.dataset['data_'+str(i)] for i in range(32)]).T
一旦我使用了该代码,代码的速度几乎提高了 1000 倍。