如何从多个同维度重叠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
相关产品推荐
相关产品推荐

