You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多个同维度重叠2D数组生成逐位置最值掩码数组

问题原因

你当前报错是因为max(globals()[f"data{i}"][j][k])里传入的是单个像素的numpy.float32值,Python内置的max()函数需要传入可迭代对象(比如列表、多个参数)才能计算最值,单个数值无法迭代,所以抛出TypeError。另外你写的三层Python循环效率极低,处理影像级数组会非常慢,完全可以用numpy自带的向量化运算实现需求。

最优解决方案

不用生成大量全局变量data1985、data1986,直接把所有读取到的数组存入同一个列表,后续用numpy的维度运算一步得到结果:

import numpy as np

# 第一步:读取所有影像存入列表
data_list = []
geo_list = []
proj_list = []
for i in range(1985, 2021):
    data, geo, proj = read_tif(r"C:\Users\wqtcl\Desktop\REDD\images/" + str(i) + ".tif")
    data[np.isnan(data)] = 23
    data_list.append(data)
    geo_list.append(geo)
    proj_list.append(proj)

# 第二步:堆叠为3维数组,形状为 (36, 行数, 列数),第0维是年份维度
stacked_data = np.stack(data_list, axis=0)

# 第三步:沿年份维度逐像素取最大、最小值,直接得到结果
max_mask = np.max(stacked_data, axis=0)
min_mask = np.min(stacked_data, axis=0)
代码说明
  • np.stack会把所有形状相同的2D数组合并为一个3D数组,第0个维度对应不同年份的数组
  • 调用np.max/np.min时指定axis=0,就是要求numpy沿第0个维度(年份维度),对每一个相同行、列位置的所有像素值计算最值,刚好完全符合你的需求,运算效率比手写Python循环高几十到上百倍
  • 如果你需要保留对应的地理信息,geo_list[0]和proj_list[0]就是和mask匹配的地理变换和投影参数(因为所有影像维度相同、地理范围一致)

内容的提问来源于stack exchange,提问作者Claire Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:27:01