2012-01-19 10 views
1

PyTablesは、IsDescriptionクラスを継承するユーザ定義クラスからテーブルを作成することをサポートしています。これは、ドキュメントから次の例のように、多次元細胞のためのサポートを含む:PyTablesセルに任意の形状の多次元配列を格納することは可能ですか?

class Particle(IsDescription): 
    name = StringCol(itemsize=16) # 16-character string 
    lati = Int32Col() # integer 
    longi = Int32Col() # integer 
    pressure = Float32Col(shape=(2,3)) # array of floats (single-precision) 
    temperature = Float64Col(shape=(2,3)) # array of doubles (double-precision) 

しかし、それは単一のセルに任意形状多次元配列を格納することができますか?上記の例に続いて、pressure = Float32Col(shape=(x, y))のようなものがあり、各行の挿入時にxyが決定されます。

そうでない場合は、どのようなアプローチが適していますか?一意の名前を持つ012(任意形状の)多次元配列をCArrayに格納し、それらの名前をマスターインデックステーブルに格納しますか?私が想像しているアプリケーションは、画像とそれに関連するメタデータを格納しています。これは、numexprを照会して使用することができるようにしたいと考えています。

PyTablesのベストプラクティスへのあらゆる指針は非常に高く評価されています。

答えて

0

短い答えは "いいえ"で、私はpytablesではなくhdf5の "制限"だと思います。

私は、ストレージの各ユニット(複合データセット)は、定義されたサイズでなければならないと考えています.1つ以上のコンポーネントがサイズを変更できる場合は明らかにそうではありません。 hdf5のデータセットをサイズ変更して拡張することは可能ですが(pytablesはこれを大量に使用しますが)、その配列内のデータの単位は扱いません。

私は、最も良いことは、 のいずれかであると思われます。a)十分に定義されたサイズにし、オーバーフローのフラグを設定します。これは、最大の妥当なサイズが依然として非常に小さく、テールイベントがスローされても問題ない場合はうまく動作します。 hdf5圧縮で未使用のディスクスペースに乗ることができるかもしれないことに注意してください。 b)同じファイルに新しいCArrayを作成することをお勧めします。

HDF5は、実際にはhdf5ファイルに画像を保存するように設計された(最適化された)an APIを持っています。私はpytablesで公開されているとは思わない。

1

長い答えは「はい、でもしたくないでしょう」

PyTablesはおそらく直接サポートしていませんが、HDF5はネストされた可変長データ型の作成をサポートしており、多次元の不揃いの配列を許可しています。その道を下りたい場合は、h5pyを使用し、HDF5 User's Guide, Datatypes chapterを参照してください。セクション6.4.3.2.3を参照してください。可変長データ型。 (私はそれをリンクしますが、彼らは明らかにアンカーを深く置かないことを選択しました)。

あなたが持っているデータを個人的に整理する方法は、データセットのグループであり、単一のテーブルではありません。つまり、

/particles/particlename1/pressure 
/particles/particlename1/temperature 
/particles/particlename2/pressure 
/particles/particlename2/temperature 

などのようなものです。緯度と経度の値は、データセットではなく/particles/particlenameグループの属性になりますが、小さなデータセットを使用すると完全に問題ありません。

緯度と経度に基づいて検索できるようにするには、緯度/経度/名前の列を持つデータセットを使用するとよいでしょう。本当に欲しいのであれば、参照用のHDF5データ型があり、データセットへのポインタ、またはデータセットのサブセットにもポインタを格納できます。

+0

非常に助かりました、ありがとうございます。 – Nick

関連する問題