numpy.ma掩码数组去掩码后出现None的原因及恢复方法
Numpy掩码数组取消掩码后原掩码位置出现None的问题分析与解决
问题重现
首先创建原始数组:
import numpy as np import numpy.ma as ma f_vars = np.array([[3, 4, -1, -1], [7, 8, 9, -1], [2, 3, 9, -1], [0, 1, 2, -1], [0, 2, -1, -1], [0, 1, 2, -1], [0, 1, 3, 4], [3, 4, 5, -1], [6, 7, -1, -1], [6, 7, -1, -1]])
接着创建掩码数组,掩码第3、4行(索引2、3)的所有元素:
# 修正原代码变量名错误,基于原始数组f_vars创建掩码数组 f_vars_r = ma.masked_array(f_vars, mask=[[0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 1, 1], [1, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
修改未掩码元素后,将掩码设为全False取消掩码:
f_vars_r = ma.masked_array(f_vars_r, mask=[[False]*4 for _ in range(10)])
预期未掩码位置显示修改后的值,原掩码位置保留初始值,但实际输出中原掩码行出现None:
[[0 3 -1 -1] [6 7 8 -1] [None None None None] [None None None None] [1 0 -1 -1] [1 2 0 -1] [1 2 0 3] [0 3 4 -1] [5 6 -1 -1] [5 6 -1 -1]]
原因分析
这不是“未成功移除掩码”,而是掩码数组的机制导致原掩码位置的元素被替换为填充值:
- 创建掩码数组时,被掩码的元素会被标记为“无效”,numpy.ma内部会自动将这些无效元素设置为默认填充值(整数数组的默认填充值表现为
None)。 - 掩码状态下,被掩码元素的访问和修改被限制,它们的原始值在掩码生效期间已被覆盖隔离,取消掩码后暴露的是填充值,而非初始值。
解决方法
要恢复原掩码位置的初始值,最可靠的方式是提前备份原始数组,在取消掩码后将原掩码区域的值从备份中恢复:
步骤1:提前备份原始数组
f_vars_backup = f_vars.copy()
步骤2:创建掩码数组并修改有效元素
f_vars_r = ma.masked_array(f_vars, mask=[[0,0,0,0], [0,0,0,0], [1,1,1,1], [1,1,1,1], [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]]) # 执行你的修改操作(示例) f_vars_r[0] = [0,3,-1,-1] f_vars_r[1] = [6,7,8,-1] f_vars_r[4] = [1,0,-1,-1] # ...其他修改
步骤3:取消掩码并恢复原掩码区域的值
# 获取掩码数组的底层数据(原掩码区域此时为填充值) f_vars_r = f_vars_r.data # 从备份中恢复第3、4行(索引2到3)的初始值 f_vars_r[2:4] = f_vars_backup[2:4]
执行后,原掩码位置会恢复为初始值,未掩码位置保留修改后的值。
内容的提问来源于stack exchange,提问作者Petar Andreev
相关产品推荐
相关产品推荐

