这是我目前用来打开这个非常大的matlab文件的代码:
self.data = {}
f = h5py.File(filepath, 'r')
for k, v in f.items():
self.data[k] = np.array(v)
self.data = list(self.data.items())
self.data = np.array(self.data)
self.fs = self.data[1][1][0][0]
self.data = self.data[0][1]
print('fs = ', self.fs)
print('DONE. Data read using h5py reader')
大约需要3-5分钟才能完全加载。我怎样才能改进这段代码来加速这个过程呢?
发布于 2021-04-13 04:20:40
保存和使用对象很容易。如果不知道代码的用途,就很难提供关于对象和数组的详细信息。在获得变量self.data
之后,你想对它做什么?检索所有数据集,然后不断重新定义self.data
。最后,将self.data
分配给第一个数据集的数组。此外,self.fs
指向第二个数据集中的单个值。因此,还不清楚为什么要检索所有这些数据。
如果您只需要第一个数据集中的数据,下面这样的代码就可以满足您的需求。
f = h5py.File(filepath, 'r')
# returns first key from group member names:
dsname = next(iter(f)) # (name of 1st dataset)
self.data = f[dsname][:] # (data from 1st dataset)
如果您想要所有数据集中的名称和数据,这将返回名称和对象的字典。
f = h5py.File(filepath, 'r')
for k, v in f.items():
self.data[k] = v
然后,当您需要一个数据数组时,使用以下方法之一:
arr = data['a dataset name'][:] # for 1 dataset (when you know the name)
for dsname, obj in data.items(): # loop thru all pairs in data
arr = obj[:] # or
arr = f[dsname][:]
为了理解发生了什么,让我们从一些HDF5基础知识开始。在使用HDF5时,理解模式是至关重要的。数据结构类似于计算机上的文件夹和文件。文件夹是“组”,文件是“数据集”。通过h5py,您可以使用字典语法对访问组成员进行访问,并使用数组语法对数据集进行访问。( h5py文件对象的行为类似于一个组。)
因此,当您执行for k,v in f.items()
时,h5py将为每个组成员返回key,value
对(在您的代码中为k,v
)。key
是对象的名称,value
是h5py object (数据集或另一个组)。
一旦有了数据集,有3种方法可以访问相关数据:
注意:我更喜欢方法#1和#2,因为它们在读取数据之前不会将数据加载到内存中。
这是你的代码和我对每一步的评论:
# returns a file object "f" (behaves like a group):
f = h5py.File(filepath, 'r')
# returns key/value pairs of group member names/objects:
for k, v in f.items():
# adds a dictionary key (object name) with value of an array read from object "v":
self.data[k] = np.array(v)
# converts the (name,array) dictionary into a list:
self.data = list(self.data.items())
# converts the list into a nd.array of dtype=object:
# -has 1 row for each dataset with 2 columns:
# -column 0: object name, column 1: array of data
self.data = np.array(self.data)
# reads [0][0] value from array at self.data[1][1] ([0][0] value for 2nd dataset)
self.fs = self.data[1][1][0][0]
# resets data to value from array at self.data[0][1] (array for 1st dataset)
self.data = self.data[0][1]
https://stackoverflow.com/questions/67015050
复制相似问题