2016-08-04 4 views
1

私は、特定の変数の位置(X、Y)と時間を表す大きな3D HDF5データセットを持っています。次に、同じ(X、Y)位置の分類を含む2D numpy配列があります。私が達成したいのは、2D配列の特定のクラスに属する3D HDF5データセットからすべての時系列を抽出できることです。2D条件に基づいたサブセット化のための大きな3D HDF5データセットのインデックス付け

はここに私の例です:

import numpy as np 
import h5py 

# Open the HDF5 dataset 
NDVI_file = 'NDVI_values.hdf5' 
f_NDVI = h5py.File(NDVI_file,'r') 
NDVI_data = f_NDVI["NDVI"] 

# See what's in the dataset 
NDVI_data 
<HDF5 dataset "NDVI": shape (1319, 2063, 53), type "<f4"> 

# Let's make a random 1319 x 2063 classification containing class numbers 0-4 
classification = np.random.randint(5, size=(1319, 2063)) 

は今、我々は3D HDF5データセットと2Dの分類があります。のは、クラス番号に該当画素について見てみましょう「3」

# Look for the X,Y locations that have class number '3' 
idx = np.where(classification == 3) 

これは私の条件に一致するX、Yのペアが含まれている大きさ2のタプルを返し、私のランダムな例ではペアの量は544433であります今このidx変数を使用して、分類クラス番号「3」のピクセルの544433時系列を含むサイズ(544433,53)の2D配列を作成する必要がありますか?

私は空想のインデックスと純粋な3D numpyのアレイと、この例のいくつかのテストはうまく動作しますでした:

subset = 3D_numpy_array[idx[0],idx[1],:] 

しかし、HDF5データセットはnumpyの配列に変換するのには大きすぎます。

# Try to use fancy indexing directly on HDF5 dataset 
NDVI_subset = np.array(NDVI_data[idx[0],idx[1],:]) 

それは私にエラーがスローされます:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "h5py\_objects.pyx", line 54, in h5py._objects.with_phil.wrapper  (C:\aroot\work\h5py\_objects.c:2584) 
File "h5py\_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (C:\aroot\work\h5py\_objects.c:2543) 
File "C:\Users\vtrichtk\AppData\Local\Continuum\Anaconda2\lib\site-packages\h5py\_hl\dataset.py", line 431, in __getitem__ 
selection = sel.select(self.shape, args, dsid=self.id) 
File "C:\Users\vtrichtk\AppData\Local\Continuum\Anaconda2\lib\site-packages\h5py\_hl\selections.py", line 95, in select 
sel[args] 
File "C:\Users\vtrichtk\AppData\Local\Continuum\Anaconda2\lib\site-packages\h5py\_hl\selections.py", line 429, in __getitem__ 
raise TypeError("Indexing elements must be in increasing order") 
TypeError: Indexing elements must be in increasing order 

私が試したもう一つは、第三中分類配列がnp.repeatにあるが、私はHDF5データセット上で直接同じインデックスメソッドを使用しようとしているときHDF5データセットの形状に一致する3D配列を作成します。正確に同じエラーがスローさよりも

classification_3D = np.repeat(np.reshape(classification,(1319,2063,1)),53,axis=2) 
idx = np.where(classification == 3) 

しかし、次の文:サイズ3のタプルを取得よりもidx変数HDF5データセットは、純粋なnumpyの配列に比べて動作が異なりますので

NDVI_subset = np.array(NDVI_data[idx]) 

はこれです?マニュアルでは「選択座標を昇順で指定する必要があります」

この場合、フルHDF5データセットをメモリに読み込まなくても動作する方法を提案する人はいますか? )? ありがとうございます!

+0

'h5py'ドキュメントは、高度や空想のインデックスについて何と言っていますか?私はそれを勉強して、2dの配列を使って2つの3dを動かす前に、この種のインデックスをテストできる非常に小さなテストケースを設定します。そして、私はどこですべての値を印刷することができます。確かに、H5のインデックス作成が制限されている可能性は確かです。 – hpaulj

+0

http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing – hpaulj

答えて

3

h5pyのアドバンスト/ファンシーインデックスは、np.ndarrayとほぼ同じではありません。 dset[[1,2,3],...]が、繰り返しインデックス:私のようなリストを持つ単一次元のインデックスすることができます

In [202]: ind 
Out[202]: 
(array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], dtype=int32), 
array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=int32), 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)) 

In [203]: x[ind] 
Out[203]: array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]) 
In [204]: dset[ind] 
... 
TypeError: Indexing elements must be in increasing order 

:私はすべての奇数の値を選択することができます

import h5py 
f=h5py.File('test.h5','w') 
dset=f.create_dataset('data',(5,3,2),dtype='i') 
dset[...]=np.arange(5*3*2).reshape(5,3,2) 
x=np.arange(5*3*2).reshape(5,3,2) 

ind=np.where(x%2) 

:小さなテストケースを設定し

値を変更したり、順序を変更すると、エラーが発生する(dset[[1,1,2,2],...]またはdset[[2,1,0],...])。 dset[:,[0,1],:]は問題ありません。

いくつかのスライスは、dset[0:3,1:3,:]、またはスライスとリストdset[0:3,[1,2],:]です。

しかし、2つのリストdset[[0,1,2],[1,2],:]だからnp.whereのインデックスタプルがいくつかの点で間違っている

TypeError: Only one indexing vector or array is currently allowed for advanced selection 

を生成します。

これはh5ストレージの制約と、h5pyモジュールでの不完全な開発の量がどれくらいかわかりません。たぶん両方のビット。

ファイルからより簡単なチャンクをロードし、結果として得られるnumpyの配列で好きなインデックスを実行する必要があります。私odd values場合

、私は実行する必要があります。

In [225]: dset[:,:,1] 
Out[225]: 
array([[ 1, 3, 5], 
     [ 7, 9, 11], 
     [13, 15, 17], 
     [19, 21, 23], 
     [25, 27, 29]]) 
+0

この例を共有してくれてありがとうございます。これは、h5pyインデックスの制限を明確にしています。私はあなたの解決策が「奇妙な値」の場合を見ていますが、私の場合はそう簡単な解決策がないことを恐れています。私は、各タイムステップの2D配列を別々に切り取ってから、Numpy配列の上級索引を作成する必要がありますが、これは高速で洗練されたソリューションのようには見えません。 – Kristof

関連する問題