Python numpy赋值后Mask丢失:多维数组掩码无法传递
问题:numpy掩码数组多维赋值时掩码丢失
处理大地测量数据时,使用mask覆盖无数据区域,但将单个点位的掩码数组赋值给更大的多维数组后,掩码会消失,甚至无法重新赋值掩码。
数据加载与点位提取代码
加载1°网格的日数据(排除最南端30°),转置后提取关注点位:
minmax_0_10T = np.ma.zeros((2,360,150,365)) with np.load("Data/Pythonarrays/1DEG_SM_minmax_SWI_001_SM0_10cm_2015.npz") as npz: minmax_0_10T[0] = np.ma.MaskedArray(**npz).T with np.load("Data/Pythonarrays/1DEG_SM_minmax_SWI_005_SM0_10cm_2015.npz") as npz: minmax_0_10T[1] = np.ma.MaskedArray(**npz).T spots_1deg = [[41, 210], [29, 119], [108, 196], [117, 256]] minmax_0_10_spots = np.ma.zeros((2,4,365)) """Create array of minmax and gldas spotdata for choice of SWI layer""" for i in range(len(spots_1deg)): for layer_gldas in range(len(gldas_smT)): gldas_spots[layer_gldas][i] = gldas_smT[layer_gldas][spots_1deg[i][1]][spots_1deg[i][0]] """now all different gldas layers of minmax fitting""" minmax_0_10_spots[0][i] = minmax_0_10T[0][spots_1deg[i][1]][spots_1deg[i][0]] minmax_0_10_spots[1][i] = minmax_0_10T[1][spots_1deg[i][1]][spots_1deg[i][0]]
对比minmax_0_10T[0][spots_1deg[i][1]][spots_1deg[i][0]]和minmax_0_10_spots[0][i]发现,minmax_0_10_spots的掩码完全消失(所有位置均为False)。尝试单独赋值掩码无效,用列表填充后转数组,掩码仍会消失。
简化复现案例
掩码丢失的情况(多维数组链式索引赋值)
array = np.ma.zeros((2,4,4)) data = np.ma.array(data=[0,0,5.435,3.657], mask =[True,True,False,False],fill_value=1e+20) array[0][0] = data data2 = array[0][0] # 此时data2不再包含mask
掩码正常传递的情况(少一维数组赋值)
array = np.ma.zeros((2,4)) data = np.ma.array(data=[0,0,5.435,3.657], mask =[True,True,False,False],fill_value=1e+20) array[0] = data data2 = array[0] # 此时data2保留mask
解决方案
问题根源在于链式索引(array[0][0])赋值时,无法正确同步掩码信息,第一次索引返回的视图仅操作数据部分,未关联掩码。修改为numpy标准的逗号分隔索引即可解决:
修改简化案例代码
array = np.ma.zeros((2,4,4)) data = np.ma.array(data=[0,0,5.435,3.657], mask =[True,True,False,False],fill_value=1e+20) array[0, 0] = data # 改用逗号分隔的索引 data2 = array[0, 0] # 此时data2保留原始mask
修改点位提取代码
将链式索引替换为逗号分隔索引:
minmax_0_10_spots[0, i] = minmax_0_10T[0, spots_1deg[i][1], spots_1deg[i][0]] minmax_0_10_spots[1, i] = minmax_0_10T[1, spots_1deg[i][1], spots_1deg[i][0]]
此外,初始化目标数组时,可显式指定掩码结构(比如np.ma.zeros((2,4,365), mask=False)),确保掩码维度与数据完全匹配,避免赋值时掩码被忽略。
内容的提问来源于stack exchange,提问作者GemGre
相关产品推荐
相关产品推荐

