Ich habe einen großen 3D-HDF5-Datensatz, der Position (X, Y) und Zeit für eine bestimmte Variable darstellt. Als nächstes habe ich ein 2D-Nummernfeld, das eine Klassifizierung für die gleiche (X, Y) Position enthält. Was ich erreichen möchte, ist, dass ich alle Zeitreihen aus dem 3D-HDF5-Datensatz extrahieren kann, die unter eine bestimmte Klasse im 2D-Array fallen.Indizieren eines großen 3D-HDF5-Datensatzes für eine Teilmenge basierend auf einer 2D-Bedingung
Hier ist mein Beispiel:
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))
Jetzt haben wir unsere 3D-Datensatz HDF5 und eine Klassifizierung 2D. Lassen Sie uns für Pixel suchen, die unter Klassennummer fallen ‚3‘
# Look for the X,Y locations that have class number '3'
idx = np.where(classification == 3)
Das gibt mir ein Tupel von Größe 2, die die X enthält, Y-Paare, die den Zustand entsprechen, und in meinem willkürliches Beispiel die Menge der Paare ist 544433 Wie soll ich jetzt diese idx
Variable verwenden, um ein 2D-Array der Größe (544433,53) zu erstellen, das die 544433-Zeitreihe der Pixel mit der Klassifizierungsklassennummer '3' enthält?
Ich habe einige Tests mit ausgefallener Indizierung und reinen 3D numpy Arrays und diesem Beispiel würde gut funktionieren:
subset = 3D_numpy_array[idx[0],idx[1],:]
jedoch der HDF5-Datensatz zu groß ist, um eine numpy Array zu konvertieren; wenn ich versuche, die gleiche Indexierungsmethode direkt auf dem HDF5-Datensatz zu verwenden:
# Try to use fancy indexing directly on HDF5 dataset
NDVI_subset = np.array(NDVI_data[idx[0],idx[1],:])
Es wirft mir einen Fehler:
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
Eine andere Sache, habe ich versucht, np.repeat
ist die Klassifizierung Array in den dritten Dimension, um ein 3D-Array zu erstellen, das der Form des HDF5-Datasets entspricht. Die idx
Variablen als bekommen ein Tupel von Größe 3:
classification_3D = np.repeat(np.reshape(classification,(1319,2063,1)),53,axis=2)
idx = np.where(classification == 3)
Aber die folgende Anweisung als die exakt gleichen Fehler führt:
NDVI_subset = np.array(NDVI_data[idx])
Ist dies, weil der HDF5-Datensatz funktioniert anders im Vergleich zu einem reinen numpy Array ? Die Dokumentation sagt "Auswahlkoordinaten müssen in aufsteigender Reihenfolge gegeben werden"
Hat jemand in diesem Fall einen Vorschlag, wie ich das zum Funktionieren bringen könnte, ohne den vollen HDF5-Datensatz in den Speicher einzulesen (was nicht funktioniert)) Vielen Dank!
Was bedeutet 'h5py' doc sagen über erweiterte oder ausgefallene Indizierung? Ich würde das studieren und dann einen viel kleineren Testfall aufstellen, in dem ich diese Art der Indexierung auf dem 2D-Array testen kann, bevor ich zwei 3D verschiebe. Und wo ich alle Werte drucken kann. Es ist sicherlich möglich, dass H5 in der Indizierung eingeschränkter ist. – hpaulj
http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing – hpaulj