Arrays in Earth Engine bestehen aus Listen mit Zahlen und Listen von Listen. Der Nesting-Grad bestimmt die Anzahl der Dimensionen. Als einfaches, anschauliches Beispiel betrachten wir das folgende Beispiel für eine Array
, die aus den TC-Koeffizienten (tassel cap) von Landsat 8 erstellt wurde (Baig et al., 2014):
// Create an Array of Tasseled Cap coefficients. var coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ]);
import ee import geemap.core as geemap
# Create an Array of Tasseled Cap coefficients. coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ])
Prüfen Sie mit length()
, ob es sich um ein 6 × 6 m großes 2D-Array handelt. Dadurch werden die Längen der einzelnen Achsen zurückgegeben:
// Print the dimensions. print(coefficients.length()); // [6,6]
import ee import geemap.core as geemap
# Print the dimensions. display(coefficients.length()) # [6,6]
Die folgende Tabelle veranschaulicht die Anordnung der Matrixeinträge entlang der 0‑Achse und der 1‑Achse:
1-Achse –> | |||||||
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | ||
0 | 0,3029 | 0,2786 | 0,4733 | 0,5599 | 0,508 | 0,1872 | |
1 | -0.2941 | -0,243 | -0,5424 | 0,7276 | 0,0713 | -0,1608 | |
Nullachse | 2 | 0,1511 | 0,1973 | 0,3283 | 0,3407 | -0,7117 | − 0,4559 |
3 | -0,8239 | 0,0849 | 0,4396 | -0,058 | 0,2013 | -0.2773 | |
4 | -0,3294 | 0,0557 | 0,1056 | 0,1855 | -0.4349 | 0,8085 | |
5 | 0,1079 | -0,9023 | 0,4119 | 0,0575 | -0,0259 | 0,0252 |
Die Indizes links in der Tabelle geben die Positionen entlang der 0-Achse an. Das n-te Element in jeder Liste auf der 0-Achse befindet sich auf der 1-Achse auf der n-ten Position. Beispiel: Der Eintrag an der Koordinate [3, 1] des Arrays ist 0,0849. Angenommen, „Grünheit“ ist die TC-Komponente, die Sie interessieren würde. Sie können die Submatrix für die Grünheit mit slice()
abrufen:
// Get the 1x6 greenness slice, display it. var greenness = coefficients.slice({axis: 0, start: 1, end: 2, step: 1}); print(greenness);
import ee import geemap.core as geemap
# Get the 1x6 greenness slice, display it. greenness = coefficients.slice(axis=0, start=1, end=2, step=1) display(greenness)
Die 2D-Grünmatrix sollte in etwa so aussehen:
[[-0.2941,-0.243,-0.5424,0.7276,0.0713,-0.1608]]
Die Parameter start
und end
von slice()
entsprechen den in der Tabelle angezeigten Indizes der Nullachse (start
ist einschließend und end
ausschließend).
Array-Bilder
Um ein Grünheitsbild zu erhalten, multiplizieren Sie die Bänder eines Landsat 8-Bildes mit der Grünheitsmatrix. Dazu wandeln Sie zuerst das mehrbandige Landsat-Bild in ein „Array-Bild“ um, bei dem jedes Pixel ein Array
von Bandwerten ist. Beispiel:
// Load a Landsat 8 image, select the bands of interest. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318') .select(['B2', 'B3', 'B4', 'B5', 'B6', 'B7']); // Make an Array Image, with a 1-D Array per pixel. var arrayImage1D = image.toArray(); // Make an Array Image with a 2-D Array per pixel, 6x1. var arrayImage2D = arrayImage1D.toArray(1);
import ee import geemap.core as geemap
# Load a Landsat 8 image, select the bands of interest. image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select( ['B2', 'B3', 'B4', 'B5', 'B6', 'B7'] ) # Make an Array Image, with a 1-D Array per pixel. array_image_1d = image.toArray() # Make an Array Image with a 2-D Array per pixel, 6x1. array_image_2d = array_image_1d.toArray(1)
In diesem Beispiel wird image
durch toArray()
in ein Arraybild umgewandelt, in dem jedes Pixel ein eindimensionaler Vektor ist, dessen Einträge den 6 Werten an den entsprechenden Positionen in den Bändern von image
entsprechen. Ein auf diese Weise erstelltes Array-Bild von 1‑dimensionalen Vektoren hat kein Konzept für eine 2‑dimensionale Form. Wenn Sie nur 2D-Vorgänge wie die Matrixmultiplikation ausführen möchten, konvertieren Sie das Bild mit toArray(1)
in ein 2D-Array pro Pixel. Jedes Pixel des 2D-Arraybilds enthält eine 6 × 1 Matrix von Bandwerten. Das folgende Beispiel veranschaulicht dies:
var array1D = ee.Array([1, 2, 3]); // [1,2,3] var array2D = ee.Array.cat([array1D], 1); // [[1],[2],[3]]
import ee import geemap.core as geemap
array_1d = ee.Array([1, 2, 3]) # [1,2,3] array_2d = ee.Array.cat([array_1d], 1) # [[1],[2],[3]]
Der array1D
-Vektor variiert entlang der 0-Achse. Das gilt auch für die array2D
-Matrix, die aber eine zusätzliche Dimension hat. Wenn Sie toArray(1)
auf das Arraybild anwenden, ist das so, als würden Sie cat(bandVector, 1)
auf jedes Pixel anwenden. Multiplizieren Sie das 2D-Array-Bild mit einem Bild, bei dem jedes Pixel eine 2D-Matrix mit Grünheitskoeffizienten enthält:
// Do a matrix multiplication: 1x6 times 6x1. // Cast the greenness Array to an Image prior to multiplication. var greennessArrayImage = ee.Image(greenness).matrixMultiply(arrayImage2D);
import ee import geemap.core as geemap
# Do a matrix multiplication: 1x6 times 6x1. # Cast the greenness Array to an Image prior to multiplication. greenness_array_image = ee.Image(greenness).matrixMultiply(array_image_2d)
Das Ergebnis ist ein neues Rasterbild, bei dem jedes Pixel die 1 × 1-Matrix ist, die durch die Matrixmultiplikation der 1 × 6-Grünmatrix (links) und der 6 × 1-Bandmatrix (rechts) entsteht. Konvertieren Sie das Bild mit arrayGet()
in ein normales, einfarbiges Bild, um es anzuzeigen:
// Get the result from the 1x1 array in each pixel of the 2-D array image. var greennessImage = greennessArrayImage.arrayGet([0, 0]); // Display the input imagery with the greenness result. Map.setCenter(-122.3, 37.562, 10); Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], min: 0, max: 0.5}, 'image'); Map.addLayer(greennessImage, {min: -0.1, max: 0.13}, 'greenness');
import ee import geemap.core as geemap
# Get the result from the 1x1 array in each pixel of the 2-D array image. greenness_image = greenness_array_image.arrayGet([0, 0]) # Display the input imagery with the greenness result. m = geemap.Map() m.set_center(-122.3, 37.562, 10) m.add_layer(image, {'bands': ['B5', 'B4', 'B3'], 'min': 0, 'max': 0.5}, 'image') m.add_layer(greenness_image, {'min': -0.1, 'max': 0.13}, 'greenness') m
Hier ist ein vollständiges Beispiel, in dem das gesamte Coefficients-Array verwendet wird, um mehrere Komponenten mit Quasten gleichzeitig zu berechnen und das Ergebnis anzuzeigen:
// Define an Array of Tasseled Cap coefficients. var coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ]); // Load a Landsat 8 image, select the bands of interest. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318') .select(['B2', 'B3', 'B4', 'B5', 'B6', 'B7']); // Make an Array Image, with a 1-D Array per pixel. var arrayImage1D = image.toArray(); // Make an Array Image with a 2-D Array per pixel, 6x1. var arrayImage2D = arrayImage1D.toArray(1); // Do a matrix multiplication: 6x6 times 6x1. var componentsImage = ee.Image(coefficients) .matrixMultiply(arrayImage2D) // Get rid of the extra dimensions. .arrayProject([0]) .arrayFlatten( [['brightness', 'greenness', 'wetness', 'fourth', 'fifth', 'sixth']]); // Display the first three bands of the result and the input imagery. var vizParams = { bands: ['brightness', 'greenness', 'wetness'], min: -0.1, max: [0.5, 0.1, 0.1] }; Map.setCenter(-122.3, 37.562, 10); Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], min: 0, max: 0.5}, 'image'); Map.addLayer(componentsImage, vizParams, 'components');
import ee import geemap.core as geemap
# Define an Array of Tasseled Cap coefficients. coefficients = ee.Array([ [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872], [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608], [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559], [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773], [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085], [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252], ]) # Load a Landsat 8 image, select the bands of interest. image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select( ['B2', 'B3', 'B4', 'B5', 'B6', 'B7'] ) # Make an Array Image, with a 1-D Array per pixel. array_image_1d = image.toArray() # Make an Array Image with a 2-D Array per pixel, 6x1. array_image_2d = array_image_1d.toArray(1) # Do a matrix multiplication: 6x6 times 6x1. components_image = ( ee.Image(coefficients) .matrixMultiply(array_image_2d) # Get rid of the extra dimensions. .arrayProject([0]) .arrayFlatten( [['brightness', 'greenness', 'wetness', 'fourth', 'fifth', 'sixth']] ) ) # Display the first three bands of the result and the input imagery. viz_params = { 'bands': ['brightness', 'greenness', 'wetness'], 'min': -0.1, 'max': [0.5, 0.1, 0.1], } m = geemap.Map() m.set_center(-122.3, 37.562, 10) m.add_layer(image, {'bands': ['B5', 'B4', 'B3'], 'min': 0, 'max': 0.5}, 'image') m.add_layer(components_image, viz_params, 'components') m
Wenn Sie Bänder aus einem Arraybild abrufen, entfernen Sie zuerst die zusätzlichen Dimensionen mit project()
und konvertieren Sie es dann mit arrayFlatten()
wieder in ein normales Bild. Die Ausgabe sollte in etwa so aussehen:
