1

PyTables は、IsDescription クラスから継承するユーザー定義クラスからのテーブルの作成をサポートしています。これには、ドキュメントの次の例のように、多次元セルのサポートが含まれます。

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))wherexおよびare が決定されるようなものです。y

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

PyTables のベスト プラクティスへのポインタは大歓迎です。

4

2 に答える 2

1

長い答えは「はい、しかしおそらくしたくないでしょう」です。

PyTables はおそらくそれを直接サポートしていませんが、HDF5 はネストされた可変長データ型の作成をサポートしており、多次元での不規則な配列を許可しています。そのパスをたどりたい場合は、h5pyを使用して、 HDF5 ユーザー ガイドのデータ型の章を参照してください。セクション6.4.3.2.3 を参照してください。可変長データ型。(私はそれをリンクしますが、彼らはアンカーをそれほど深く置かないことを選択したようです)。

個人的には、取得したデータを整理する方法は、単一のテーブルではなく、データセットのグループにまとめることです。つまり、次のようなものです。

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

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

緯度と経度に基づいて検索できるようにしたい場合は、緯度/経度/名前の列を含むデータセットを用意するとよいでしょう。また、さらに凝ったものにしたい場合は、参照用の HDF5 データ型があり、データセットへのポインター、またはデータセットのサブセットへのポインターを格納することもできます。

于 2012-01-24T20:13:01.083 に答える
0

短い答えは「いいえ」です.pytablesではなくhdf5の「制限」だと思います。

その理由は、ストレージの各ユニット (複合データセット) が明確に定義されたサイズでなければならないためだと思います。hdf5 のデータセットのサイズ変更と拡張は完全に可能ですが (pytables はこれを多用します)、その配列内のデータの単位は変更できません。

最善の方法は次のいずれかだと思います:a)適切に定義されたサイズにし、オーバーフローのフラグを提供します。これは、妥当な最大サイズがまだかなり小さく、テール イベントがスローされても問題ない場合にうまく機能します。hdf5圧縮を使用すると、未使用のディスクスペースを利用できる場合があることに注意してください。b)同じファイルに新しいCArrayを作成することを提案したとおりに実行し、必要に応じてそれを読み込んでください。(物事を整理するために、これらすべてを独自のグループに入れたいと思うかもしれません)

HDF5 には、実際にはhdf5 ファイルに画像を保存するために設計 (および最適化) された APIがあります。私はそれがpytablesで公開されているとは思わない。

于 2012-01-24T16:59:24.770 に答える