私は、特定の変数の位置(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データセットをメモリに読み込まなくても動作する方法を提案する人はいますか? )? ありがとうございます!
'h5py'ドキュメントは、高度や空想のインデックスについて何と言っていますか?私はそれを勉強して、2dの配列を使って2つの3dを動かす前に、この種のインデックスをテストできる非常に小さなテストケースを設定します。そして、私はどこですべての値を印刷することができます。確かに、H5のインデックス作成が制限されている可能性は確かです。 – hpaulj
http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing – hpaulj