GEE错误——Tile error: Arrays must have same lengths on all axes but the cat axis

简介: GEE错误——Tile error: Arrays must have same lengths on all axes but the cat axis

错误:

我想使用 arrayCat 来联系图像。但是,我总是收到错误“数组必须在除猫轴之外的所有轴上具有相同的长度”。

imgCat: Tile error: Arrays must have same lengths on all axes but the cat axis

 

原始代码:

var modis = ee.ImageCollection("MODIS/061/MOD13Q1"),
    ext = 
    /* color: #d63000 */
    /* shown: false */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[-97.06328232288361, 37.62180252692555],
          [-97.06328232288361, 32.220887742314595],
          [-85.28593857288362, 32.220887742314595],
          [-85.28593857288362, 37.62180252692555]]], null, false),
    testPt = /* color: #98ff00 */ee.Geometry.Point([-93.9324058090546, 35.00147792091121]);
var VIs = modis.filterDate('2021','2023')
               .select('NDVI');
Map.centerObject(testPt,16);
var arrVIs = VIs.map(function (img){
  return img.clip(ext).set('system:time_start',img.get('system:time_start'));
}).toBands().toArray().toArray(1);               
var mask_NDVI_Higher =  arrVIs.gt(6500);
var zeroImg = ee.Image(0).toArray().toArray(1);
// I want to replace the last mask pixel with my own mask. However, it
// failed due to the dimension of the array was varied at pixel scale.
var imgCat = arrVIs.arrayMask(mask_NDVI_Higher).arraySlice(1,0,-1)
                   .arrayCat(zeroImg,1);
Map.addLayer(VIs,{},'VIs',false);
Map.addLayer(arrVIs,{},'arrVIs',false);
Map.addLayer(mask_NDVI_Higher,{},'mask_NDVI_Higher',false);
Map.addLayer(imgCat,{},'imgCat')

函数:

toArray(axis)

Concatenates pixels from each band into a single array per pixel. The result will be masked if any input bands are masked.

Arguments:

this:image (Image):

Image of bands to convert to an array per pixel. Bands must have scalar pixels, or array pixels with equal dimensionality.

axis (Integer, default: 0):

Axis to concatenate along; must be at least 0 and at most the dimension of the inputs. If the axis equals the dimension of the inputs, the result will have 1 more dimension than the inputs.

Returns: Image

arraySlice(axis, start, end, step)

Creates a subarray by slicing out each position along the given axis from the 'start' (inclusive) to 'end' (exclusive) by increments of 'step'. The result will have as many dimensions as the input, and the same length in all directions except the slicing axis, where the length will be the number of positions from 'start' to 'end' by 'step' that are in range of the input array's length along 'axis'. This means the result can be length 0 along the given axis if start=end, or if the start or end values are entirely out of range.

Arguments:

this:input (Image):

Input array image.

axis (Integer, default: 0):

Axis to subset.

start (Image, default: null):

The coordinate of the first slice (inclusive) along 'axis'. Negative numbers are used to position the start of slicing relative to the end of the array, where -1 starts at the last position on the axis, -2 starts at the next to last position, etc. There must one band for start indices, or one band per 'input' band. If this argument is not set or masked at some pixel, then the slice at that pixel will start at index 0.

end (Image, default: null):

The coordinate (exclusive) at which to stop taking slices. By default this will be the length of the given axis. Negative numbers are used to position the end of slicing relative to the end of the array, where -1 will exclude the last position, -2 will exclude the last two positions, etc. There must be one band for end indices, or one band per 'input' band. If this argument is not set or masked at some pixel, then the slice at that pixel will end just after the last index.

step (Integer, default: 1):

The separation between slices along 'axis'; a slice will be taken at each whole multiple of 'step' from 'start' (inclusive) to 'end' (exclusive). Must be positive.

Returns: Image

arrayMask(mask)

Creates an array image where each array-valued pixel is masked with another array-valued pixel, retaining only the elements where the mask is non-zero. If the mask image has one band it will be applied to all the bands of 'input', otherwise they must have the same number of bands.

Arguments:

this:input (Image):

Array image to mask.

mask (Image):

Array image to mask with.

Returns: Image

arrayCat(image2, axis)

Creates an array image by concatenating each array pixel along the given axis in each band.

Arguments:

this:image1 (Image):

First array image to concatenate.

image2 (Image):

Second array image to concatenate.

axis (Integer):

Axis to concatenate along.

Returns: Image

 

修改后代码:

var modis = ee.ImageCollection("MODIS/061/MOD13Q1"),
    ext = 
    /* color: #d63000 */
    /* shown: false */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[-97.06328232288361, 37.62180252692555],
          [-97.06328232288361, 32.220887742314595],
          [-85.28593857288362, 32.220887742314595],
          [-85.28593857288362, 37.62180252692555]]], null, false),
    testPt = /* color: #98ff00 */ee.Geometry.Point([-93.9324058090546, 35.00147792091121]);
var VIs = modis.filterDate('2021','2023')
               .select('NDVI');
Map.centerObject(testPt,16);
var arrVIs = VIs.map(function (img){
  return img.clip(ext).set('system:time_start',img.get('system:time_start'));
}).toBands().toArray().toArray(1);               
var mask_NDVI_Higher =  arrVIs.gt(6500);
var zeroImg = ee.Image(0).toArray().toArray(1);
Map.addLayer(zeroImg)
Map.addLayer(arrVIs.arraySlice(1,0,-1))
// I want to replace the last mask pixel with my own mask. However, it
// failed due to the dimension of the array was varied at pixel scale.
var imgCat = arrVIs.arrayMask(mask_NDVI_Higher).arraySlice(1,0,-1)
                   .arrayCat(zeroImg,1);
/*Map.addLayer(VIs,{},'VIs',false);
Map.addLayer(arrVIs,{},'arrVIs',false);
Map.addLayer(mask_NDVI_Higher,{},'mask_NDVI_Higher',false);
Map.addLayer(imgCat,{},'imgCat')
*/

建议:

在 toArray() 之前做你想做的一些工作,然后加载影像

相关文章
|
6月前
【echarts报错】line series not exists,should be same with series name or data name
【echarts报错】line series not exists,should be same with series name or data name
224 0
|
1月前
|
机器学习/深度学习 索引 Python
Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码
本文解释了NumPy中`argmax`函数的`axis`参数在不同维度数组中的应用,并通过代码示例展示了如何使用`axis=0`、`axis=1`和`axis=-1`来找到数组中最大值的索引。
81 0
Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码
|
3月前
|
搜索推荐 Docker 容器
生信分析代码之前还好好的,怎么就报错了 Error in Ops. data. frame(guide_loc, panel_loc) :'==' only defined for equally-sized data frames
执行 `DimPlot` 函数时遇到错误 `;Error in Ops. data. frame(g guides_loc, panel_loc) : '==' only defined for equally-sized data frames`。解决方案和办法
979 0
生信分析代码之前还好好的,怎么就报错了 Error in Ops. data. frame(guide_loc, panel_loc) :'==' only defined for equally-sized data frames
|
4月前
|
数据处理 开发者 索引
【Python】已解决:FutureWarning: The frame.append method is deprecated and will be removed from pandas in
【Python】已解决:FutureWarning: The frame.append method is deprecated and will be removed from pandas in
167 0
|
Python
Python报错ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Python报错ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
1566 1
135Echarts - 路径图(Use lines to draw 1 million ny streets.)
135Echarts - 路径图(Use lines to draw 1 million ny streets.)
34 0
200Echarts - 自定义系列(Use custom series to draw wind vectors)
200Echarts - 自定义系列(Use custom series to draw wind vectors)
33 0
|
索引 Python
Python报错:IndexError: index 0 is out of bounds for axis 0 with size 0
Python报错:IndexError: index 0 is out of bounds for axis 0 with size 0
368 0
|
编译器 Python
ValueError matplotlib display text must have all code points 128 or use Unicode strings
ValueError matplotlib display text must have all code points 128 or use Unicode strings
234 0
|
Python
np.linspace、 np.arange、np.logspace三个函数的对比分析--python学习笔记24
np.linspace、 np.arange、np.logspace三个函数的对比分析--python学习笔记24
250 0