如何在Numpy中定位Masked Array的掩码位置并按规则赋值?
实现方法:基于Masked Array给wt数组赋值
嘿,这个需求用Python的numpy掩码数组工具就能轻松搞定,我给你两种靠谱的实现方案,按需选择就行:
方案一:分步赋值(直观易懂)
这种方法按规则顺序逐个处理,逻辑清晰,适合新手理解:
import numpy as np import numpy.ma as ma # 先模拟测试数据(你可以替换成自己的chl和wt数组) # 创建一个5x5的随机数组,把值为0的位置设为掩码,模拟chl掩码数组 chl = ma.masked_values(np.random.randint(0, 15, size=(5,5)), 0) # 创建和chl同形状的wt数组,初始值随便设,后面会覆盖 wt = np.zeros_like(chl) # 按规则赋值 # 1. 处理chl的掩码位置,赋值0 wt[chl.mask] = 0 # 2. 处理chl > 10的位置,赋值3 wt[chl > 10] = 3 # 3. 处理5 < chl < 10的位置,赋值2 wt[(chl < 10) & (chl > 5)] = 2 # 4. 处理chl < 5的位置,赋值1 wt[chl < 5] = 1
为什么这样可行?
numpy的掩码数组(numpy.ma.MaskedArray)在做比较运算时,掩码位置会自动被排除——也就是说,chl > 10这类条件返回的布尔数组里,掩码位置都是False,所以后面的数值条件赋值不会修改已经设为0的掩码位置,完全符合你的规则。
方案二:用np.select批量处理(简洁高效)
如果你的条件较多,用np.select可以把所有规则整合在一起,代码更紧凑:
import numpy as np import numpy.ma as ma # 同样先模拟测试数据 chl = ma.masked_values(np.random.randint(0, 15, size=(5,5)), 0) # 定义条件列表和对应的值(注意顺序:优先级高的条件放前面) conditions = [ chl.mask, # 优先级最高:掩码位置 chl > 10, # 次优先级:chl>10 (chl < 10) & (chl > 5), # 再次之:5<chl<10 chl < 5 # 最后:chl<5 ] values = [0, 3, 2, 1] # 一次性完成赋值 wt = np.select(conditions, values, default=0)
注意点
np.select会按条件列表的顺序依次检查,只要某个位置匹配第一个条件,就会使用对应的值,所以一定要把掩码条件放在最前面,确保掩码位置优先被赋值0,不会被后面的数值条件覆盖。
内容的提问来源于stack exchange,提问作者lifeodyssey
相关产品推荐
相关产品推荐

