3

ピクセル強度と次元の大きな3次元配列で構成される画像データを分析しています[frame, x, y]。これらは通常、メモリに保持するには大きすぎるため、PyTables配列としてハードディスクに常駐します。

私ができるようにしたいのは、すべてのフレームにわたるピクセルの任意のサブセットの強度を読み取ることです。これを行う自然な方法は、リストのインデックス作成のようです。

import numpy as np
import tables

tmph5 = tables.open_file('temp.hdf5', 'w')
bigarray = tmph5.create_array('/', 'bigarray', np.random.randn(1000, 200, 100))

roipixels = [[0, 1, 2, 4, 6], [34, 35, 36, 40, 41]]
roidata = bigarray[:, roipixels[0], roipixels[1]]
# IndexError: Only one selection list is allowed

残念ながら、PyTablesは現在、リストインデックスの単一のセットのみをサポートしているようです。さらに問題は、リストインデックスに重複を含めることができないことです。ピクセルのx座標のリストにが含まれるため、ピクセル[1, 2]とを同時に読み取ることができませんでした。配列内の行を反復処理できることはわかっています。[1, 3][1, 1]

roidata = np.asarray([row[roipixels[0], roipixels[1]] for row in bigarray])

しかし、これらの反復読み取りは、私が処理している多数のフレームに対して非常に遅くなります。

これを行うためのより良い方法はありますか?私はPyTablesに比較的慣れていないので、大規模な配列でデータセットを整理するためのヒントがあれば、ぜひ聞いてみてください。

4

1 に答える 1

3

どんな価値があるとしても、私はしばしば、hdf形式で保存された3D地震データで同じことをします。

ネストされたループのため、反復読み取りは遅くなります。(各行をループするのではなく)単一のループのみを実行する場合、それは非常に高速であり(少なくとも、を使用する場合h5py。私は通常、を使用してテーブルのようなデータのみを格納しますpytables)、希望どおりに実行します。

ほとんどの場合、各行ではなく、インデックスのリストを反復処理する必要があります。

基本的に、あなたは欲しいです:

roidata = np.vstack([bigarray[:,i,j] for i,j in zip(*roipixels)])

それ以外の:

roidata = np.asarray([row[roipixels[0],roipixels[1]] for row in bigarray])

これが最も一般的な使用例である場合、格納されている配列のチャンクサイズを調整すると劇的に役立ちます。あなたの場合、最初の軸に沿った長さが最も長い、長くて狭いチャンクが必要になります。

(警告:これはでテストしていませんpytablesが、で完全に機能しh5pyます。)

于 2012-06-17T00:50:19.593 に答える