hdf5使用python进行矩阵读取

时间:2017-03-27 16:25:42

标签: python performance hdf5

我有一个巨大的序列(1000000)小矩阵(32x32)存储在hdf5文件中,每个文件都有一个标签。 每个矩阵代表特定时间的传感器数据。

我希望获得每个像素的演化,以获得一个小的时间片,矩阵中的每个x,y位置都不同。

这比我预期的要花费更多时间。

  def getPixelSlice (self,xpixel,ypixel,initphoto,endphoto):

       #obtain h5 keys inside time range between initphoto and endphoto
       valid=np.where(np.logical_and(self.photoList>=initphoto,self.photoList<endphoto)) 

       #look at pixel data in valid frames
       evolution = []

       #for each valid frame, obtain the data, and append the target pixel to the list.
       for frame in valid[0]:
           data = self.h5f[str(self.photoList[frame])]          
           evolution.append(data[ypixel][xpixel])

       return evolution,valid

1 个答案:

答案 0 :(得分:0)

所以,这里有一个问题需要我一段时间才能找到类似的应用程序。由于硬盘驱动器的物理限制,数据以这样的方式存储:使用三维数组,在一个方向上读取总是比另一个方向更容易。这一切都取决于您存储数据的顺序。

如何处理此问题取决于您的应用程序。我的具体应用可以表征为“少写,多读”。在这种情况下,按照我期望读取的顺序存储数据是最有意义的。为此,我使用PyTables并指定一个与我的时间序列相同的“chunkshape”。所以,在你的情况下,它将是(1,1,1000000)。不过,我不确定这个尺寸是否太大,所以你可能需要将它分解得更远,比如说(1,1,10000)或类似的东西。

For more info see PyTables Optimization Tips.

对于打算多次读取特定方向的应用程序,为HDF5阵列选择合适的卡盘形状至关重要。