2017-03-27 14 views
0

私はhdf5ファイルに格納された小さな行列(32x32)の膨大な配列(1000000)を持っています。 この行列のそれぞれは、特定の時間のセンサーデータを表します。hdf5 pythonでマトリックスを読む

マトリックスの各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 

答えて

0

ここで問題になるのは、同様のアプリケーションを整理するのに時間がかかりました。ハードドライブの物理的な制約のため、データは3次元配列の場合、常にある方向で他の方向よりも読みやすくなります。すべてのデータが格納されている順序によって異なります。

この問題の処理方法は、アプリケーションによって異なります。私の具体的なアプリケーションは、「少数を書く、多くを読む」という特徴があります。この場合、読んでいると思われる順にデータを格納するのが最も理にかなっています。これを行うために、私はPyTablesを使用し、私の時系列のものと同じ "chunkshape"を指定します。したがって、あなたの場合、それは(1,1,1000000)になります。私はそのサイズが大きすぎるかどうか分からないので、もう少しそれを分解しなければならないかもしれません(例えば1,1,10000)かそのようなものです。あなたが特定の方向に何回も読んでするつもりのアプリケーションでは

For more info see PyTables Optimization Tips.

、あなたがあなたのHDF5アレイ用の適切なチャック形状を選ぶことが重要です。