Les tableaux dans Earth Engine sont construits à partir de listes de nombres et de listes de listes. Le degré d'imbrication détermine le nombre de dimensions. Pour commencer avec un exemple simple et motivé, considérez l'exemple suivant d'un Array
créé à partir des coefficients de la coiffe à rabat (TC) de Landsat 8 (Baig et al., 2014):
Éditeur de code (JavaScript)
// 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
Colab (Python)
# 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], ])
Vérifiez qu'il s'agit d'une matrice 2D de 6 x 6 à l'aide de length()
, qui renvoie les longueurs de chaque axe:
Éditeur de code (JavaScript)
// Print the dimensions. print(coefficients.length()); // [6,6]
import ee import geemap.core as geemap
Colab (Python)
# Print the dimensions. display(coefficients.length()) # [6,6]
Le tableau suivant illustre la disposition des entrées de la matrice le long des axes 0 et 1:
Axe 1 -> | |||||||
---|---|---|---|---|---|---|---|
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 | |
Axe 0 | 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 |
Les indices situés à gauche du tableau indiquent les positions sur l'axe 0. L'élément n de chaque liste sur l'axe 0 se trouve à la position n sur l'axe 1. Par exemple, l'entrée à la coordonnée [3,1] du tableau est 0,0849. Supposons que "vertu" soit le composant TC qui nous intéresse. Vous pouvez obtenir la sous-matrice de verdure à l'aide de slice()
:
Éditeur de code (JavaScript)
// 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
Colab (Python)
# Get the 1x6 greenness slice, display it. greenness = coefficients.slice(axis=0, start=1, end=2, step=1) display(greenness)
La matrice de verdure 2D devrait se présenter comme suit:
[[-0.2941,-0.243,-0.5424,0.7276,0.0713,-0.1608]]
Notez que les paramètres start
et end
de slice()
correspondent aux indices de l'axe 0 affichés dans le tableau (start
est inclusif et end
est exclusif).
Images de tableau
Pour obtenir une image de verdure, multipliez les bandes d'une image Landsat 8 par la matrice de verdure. Pour ce faire, commencez par convertir l'image Landsat multibande en "image matricielle", où chaque pixel est un Array
de valeurs de bande. Exemple :
Éditeur de code (JavaScript)
// 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
Colab (Python)
# 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)
Dans cet exemple, notez que toArray()
convertit image
en image matricielle dans laquelle chaque pixel est un vecteur à dimension 1, dont les entrées correspondent aux six valeurs aux positions correspondantes dans les bandes de image
. Une image de tableau de vecteurs 1D créée de cette manière n'a aucun concept de forme 2D. Pour effectuer des opérations uniquement en deux dimensions, telles que la multiplication de matrices, convertissez-la en image par pixel dans un tableau à deux dimensions avec toArray(1)
. Dans chaque pixel de l'image du tableau 2D, il existe une matrice 6x1 de valeurs de bande. Pour le voir, prenons l'exemple suivant:
Éditeur de code (JavaScript)
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
Colab (Python)
array_1d = ee.Array([1, 2, 3]) # [1,2,3] array_2d = ee.Array.cat([array_1d], 1) # [[1],[2],[3]]
Notez que le vecteur array1D
varie le long de l'axe 0. La matrice array2D
fonctionne également, mais elle comporte une dimension supplémentaire. Appeler toArray(1)
sur l'image du tableau revient à appeler cat(bandVector, 1)
sur chaque pixel. À l'aide de l'image du tableau 2D, effectuez une multiplication à gauche par une image dans laquelle chaque pixel contient une matrice 2D de coefficients de verdure:
Éditeur de code (JavaScript)
// 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
Colab (Python)
# 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)
Le résultat est une nouvelle image de tableau où chaque pixel est la matrice 1x1 résultant de la multiplication de la matrice 1x6 de la couleur verte (à gauche) et de la matrice de bande 6x1 (à droite). À des fins d'affichage, convertissez-la en image à bande unique avec arrayGet()
:
Éditeur de code (JavaScript)
// 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
Colab (Python)
# 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
Voici un exemple complet, qui utilise l'ensemble complet des coefficients pour calculer plusieurs composants de chapeau à pompon en même temps et afficher le résultat:
Éditeur de code (JavaScript)
// 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
Colab (Python)
# 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
Notez que lorsque vous obtenez des bandes à partir d'une image de tableau, commencez par supprimer les dimensions supplémentaires avec project()
, puis convertissez-la à nouveau en image standard avec arrayFlatten()
. Le résultat devrait ressembler à ceci:
