PyTables問題 - 異なる結果テーブルのサブセットを反復処理
質問
私はPyTablesに新しいですし、エージェントベースモデリングシミュレーションから生成され、HDF5に格納されたデータを処理するためにそれを使用してで探しています。私は、39メガバイトのテストファイルで働いている、といくつかの奇妙を経験しています。ここでは、テーブルのレイアウトがいます:
/example/agt_coords (Table(2000000,)) ''
description := {
"agent": Int32Col(shape=(), dflt=0, pos=0),
"x": Float64Col(shape=(), dflt=0.0, pos=1),
"y": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := 'little'
chunkshape := (20000,)
ここで私はPythonでそれにアクセスしています方法は次のとおりです。
from tables import *
>>> h5file = openFile("alternate_hose_test.h5", "a")
h5file.root.example.agt_coords
/example/agt_coords (Table(2000000,)) ''
description := {
"agent": Int32Col(shape=(), dflt=0, pos=0),
"x": Float64Col(shape=(), dflt=0.0, pos=1),
"y": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := 'little'
chunkshape := (20000,)
>>> coords = h5file.root.example.agt_coords
物事がおかしくなるのでここで、今ここにいます。
[x for x in coords[1:100] if x['agent'] == 1]
[(1, 25.0, 78.0), (1, 25.0, 78.0)]
>>> [x for x in coords if x['agent'] == 1]
[(1000000, 25.0, 78.0), (1000000, 25.0, 78.0)]
>>> [x for x in coords.iterrows() if x['agent'] == 1]
[(1000000, 25.0, 78.0), (1000000, 25.0, 78.0)]
>>> [x['agent'] for x in coords[1:100] if x['agent'] == 1]
[1, 1]
>>> [x['agent'] for x in coords if x['agent'] == 1]
[1, 1]
私は、行のセット全体の小さなサブセットを取るときの値が、私はテーブル全体を反復処理するときめちゃくちゃにされていませんが、理由を理解していません。私はこれは私がライブラリを使用していますどのようにエラーであるので、この問題で任意のヘルプは非常に高く評価されるだろうと確信しています。
解決
Table
オブジェクトの繰り返し処理を行う場合、これは混乱の非常に共通点がある、
あなたはTable
を反復するとあなたが得るアイテムの種類は、アイテムのデータではなく、現在の行の表へのアクセサ。
とそう[x for x in coords if x['agent'] == 1]
あなたはそのテーブルの「現在」の行、最後の行にすべてのポイント行アクセサのリストを作成します。しかし、あなたが行うとき、
[x["agent"] for x in coords if x['agent'] == 1]
あなたがリストを作成してあなたはアクセサを使用します。
あなたがリストを作成し、各反復でアクセサを使用することによって、あなたが必要なすべてのデータを取得するには、ソリューション。 2つのオプションがあります。
[x[:] for x in coords if x['agent'] == 1]
または
[x.fetch_all_fields() for x in coords if x['agent'] == 1]
前者はタプルのリストを作成します。後者はnumpyのボイドオブジェクトを返します。 IIRC、二つ目は高速ですが、前者は、あなたの目的のために多くの意味をなすかもしれません。
ここからの良い説明ですPyTablesの開発者。 将来のリリースでは、行アクセサオブジェクトを印刷する単純ではないかもしれませんそれは、行アクセサオブジェクトのだというデータを示すが、状態
所属していません StackOverflow