Массивы в Earth Engine состоят из списков чисел и списков списков. Степень вложенности определяет количество измерений. Чтобы начать с простого и мотивированного примера, рассмотрим следующий пример Array
, созданного на основе коэффициентов кисточки (TC) Landsat 8 ( Baig et al., 2014 ):
Редактор кода (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
Колаб (Питон)
# 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], ])
Подтвердите, что это двумерный массив 6x6, используя length()
, который вернет длины каждой оси:
Редактор кода (JavaScript)
// Print the dimensions. print(coefficients.length()); // [6,6]
import ee import geemap.core as geemap
Колаб (Питон)
# Print the dimensions. display(coefficients.length()) # [6,6]
В следующей таблице показано расположение элементов матрицы по осям 0 и 1:
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 | |
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 |
Индексы в левой части таблицы указывают положения вдоль оси 0. n-й элемент в каждом списке по оси 0 находится в n-й позиции по оси 1. Например, запись по координате [3,1] массива равна 0,0849. Предположим, что «зеленость» представляет собой интересующий нас компонент TC. Вы можете получить подматрицу зелености, используя slice()
:
Редактор кода (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
Колаб (Питон)
# Get the 1x6 greenness slice, display it. greenness = coefficients.slice(axis=0, start=1, end=2, step=1) display(greenness)
Двумерная матрица зелености должна выглядеть примерно так:
[[-0.2941,-0.243,-0.5424,0.7276,0.0713,-0.1608]]
Обратите внимание, что параметры start
и end
функции slice()
соответствуют индексам нулевой оси, отображаемым в таблице ( start
является включенным, а end
— исключающим).
Массив изображений
Чтобы получить изображение зеленого цвета, необходимо умножить полосы изображения Landsat 8 на матрицу зеленого цвета. Для этого сначала преобразуйте многоканальное изображение Landsat в «Изображение массива», где каждый пиксель представляет собой Array
значений каналов. Например:
Редактор кода (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
Колаб (Питон)
# 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)
Обратите внимание, что в этом примере toArray()
преобразует image
в массив image, в котором каждый пиксель представляет собой одномерный вектор, элементы которого соответствуют 6 значениям в соответствующих позициях в полосах image
. Изображение массива одномерных векторов, созданное таким образом, не имеет понятия двумерной формы. Чтобы выполнить только двумерные операции, такие как умножение матрицы, преобразуйте его в попиксельное изображение двумерного массива с помощью toArray(1)
. В каждом пикселе двумерного изображения массива находится матрица значений полос размером 6x1. Чтобы убедиться в этом, рассмотрим следующий пример игрушки:
Редактор кода (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
Колаб (Питон)
array_1d = ee.Array([1, 2, 3]) # [1,2,3] array_2d = ee.Array.cat([array_1d], 1) # [[1],[2],[3]]
Обратите внимание, что вектор array1D
изменяется вдоль оси 0. Матрица array2D
тоже работает, но у нее есть дополнительное измерение. Вызов toArray(1)
для изображения массива аналогичен вызову cat(bandVector, 1)
для каждого пикселя. Используя изображение двумерного массива, умножьте его слева на изображение, где каждый пиксель содержит двумерную матрицу коэффициентов зеленого:
Редактор кода (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
Колаб (Питон)
# 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)
Результатом является новое изображение массива, где каждый пиксель представляет собой матрицу 1x1, полученную в результате перемножения матрицы зелености 1x6 (слева) и матрицы полос 6x1 (справа). Для отображения преобразуйте в обычное одноканальное изображение с помощью arrayGet()
:
Редактор кода (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
Колаб (Питон)
# 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
Вот полный пример, в котором весь массив коэффициентов используется для одновременного вычисления нескольких компонентов кепки с кисточками и отображения результата:
Редактор кода (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
Колаб (Питон)
# 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
Обратите внимание: при получении полос из изображения массива сначала избавьтесь от дополнительных измерений с помощью project()
, а затем преобразуйте его обратно в обычное изображение с помощью arrayFlatten()
. Вывод должен выглядеть примерно так:

Массивы в Earth Engine состоят из списков чисел и списков списков. Степень вложенности определяет количество измерений. Чтобы начать с простого и мотивированного примера, рассмотрим следующий пример Array
, созданного на основе коэффициентов кисточки (TC) Landsat 8 ( Baig et al., 2014 ):
Редактор кода (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
Колаб (Питон)
# 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], ])
Подтвердите, что это двумерный массив 6x6, используя length()
, который вернет длины каждой оси:
Редактор кода (JavaScript)
// Print the dimensions. print(coefficients.length()); // [6,6]
import ee import geemap.core as geemap
Колаб (Питон)
# Print the dimensions. display(coefficients.length()) # [6,6]
В следующей таблице показано расположение элементов матрицы по осям 0 и 1:
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 | |
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 |
Индексы в левой части таблицы указывают положения вдоль оси 0. n-й элемент в каждом списке по оси 0 находится в n-й позиции по оси 1. Например, запись по координате [3,1] массива равна 0,0849. Предположим, что «зеленость» представляет собой интересующий нас компонент TC. Вы можете получить подматрицу зелености, используя slice()
:
Редактор кода (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
Колаб (Питон)
# Get the 1x6 greenness slice, display it. greenness = coefficients.slice(axis=0, start=1, end=2, step=1) display(greenness)
Двумерная матрица зелености должна выглядеть примерно так:
[[-0.2941,-0.243,-0.5424,0.7276,0.0713,-0.1608]]
Обратите внимание, что параметры start
и end
функции slice()
соответствуют индексам нулевой оси, отображаемым в таблице ( start
является включенным, а end
— исключающим).
Массив изображений
Чтобы получить изображение зеленого цвета, необходимо умножить полосы изображения Landsat 8 на матрицу зеленого цвета. Для этого сначала преобразуйте многоканальное изображение Landsat в «Изображение массива», где каждый пиксель представляет собой Array
значений каналов. Например:
Редактор кода (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
Колаб (Питон)
# 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)
Обратите внимание, что в этом примере toArray()
преобразует image
в массив image, в котором каждый пиксель представляет собой одномерный вектор, элементы которого соответствуют 6 значениям в соответствующих позициях в полосах image
. Изображение массива одномерных векторов, созданное таким образом, не имеет понятия двумерной формы. Чтобы выполнить только двумерные операции, такие как умножение матрицы, преобразуйте его в попиксельное изображение двумерного массива с помощью toArray(1)
. В каждом пикселе двумерного изображения массива находится матрица значений полос размером 6x1. Чтобы убедиться в этом, рассмотрим следующий пример игрушки:
Редактор кода (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
Колаб (Питон)
array_1d = ee.Array([1, 2, 3]) # [1,2,3] array_2d = ee.Array.cat([array_1d], 1) # [[1],[2],[3]]
Обратите внимание, что вектор array1D
изменяется вдоль оси 0. Матрица array2D
тоже работает, но у нее есть дополнительное измерение. Вызов toArray(1)
для изображения массива аналогичен вызову cat(bandVector, 1)
для каждого пикселя. Используя изображение двумерного массива, умножьте его слева на изображение, где каждый пиксель содержит двумерную матрицу коэффициентов зеленого:
Редактор кода (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
Колаб (Питон)
# 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)
Результатом является новое изображение массива, где каждый пиксель представляет собой матрицу 1x1, полученную в результате перемножения матрицы зелености 1x6 (слева) и матрицы полос 6x1 (справа). Для отображения преобразуйте в обычное одноканальное изображение с помощью arrayGet()
:
Редактор кода (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
Колаб (Питон)
# 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
Вот полный пример, в котором весь массив коэффициентов используется для одновременного вычисления нескольких компонентов кепки с кисточками и отображения результата:
Редактор кода (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
Колаб (Питон)
# 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
Обратите внимание: при получении полос из изображения массива сначала избавьтесь от дополнительных измерений с помощью project()
, а затем преобразуйте его обратно в обычное изображение с помощью arrayFlatten()
. Вывод должен выглядеть примерно так:
