基于多z值迭代对3D数组做掩码时全数组被屏蔽如何解决
问题原因
核心错误是掩码变量的初始化逻辑错误:
- 现有代码中
mask_1初始值为xyz[:,:,2],这是存储实际数值的浮点型二维数组 masc()返回的.mask是布尔型数组,True对应数值1、False对应数值0- 两者相加会得到数值型数组,只要数组元素值不为0,就会被
np.ma.array判定为需要掩码的True,因此出现全数组被掩码的异常。
你之前双z值的写法直接对两个布尔mask相加,布尔加法等价于逻辑或,符合多条件合并掩码的需求,只是循环版本的初始值设置错误。
修正代码
将mask_1初始化为和目标数组尺寸一致的全False布尔数组,初始状态无元素被掩码,每次迭代叠加对应z值的掩码即可:
# 初始化全False的布尔掩码 mask_1 = np.zeros_like(xyz[:, :, 2], dtype=bool) # 遍历所有z值合并掩码 for z in Z_all: mask_1 += masc(xyz, z).mask # 生成最终掩码数组 masked_array1 = np.ma.array(xyz[:, :, 2], mask=mask_1)
如果需要进一步简化,也可以直接用numpy广播替代循环,性能更高:
# 把Z_all调整为可广播的形状,一次性判断所有z的条件 mask_condition = (xyz[:, :, 2, None] <= Z_all + 0.05) & (xyz[:, :, 2, None] >= Z_all - 0.05) # 任意z满足条件就掩码 mask_1 = mask_condition.any(axis=-1) masked_array1 = np.ma.array(xyz[:, :, 2], mask=mask_1)
内容的提问来源于stack exchange,提问作者Melanie
相关产品推荐
相关产品推荐

