如何将numpy master数组的-1位置用同形状slave数组对应索引值填充
实现方案
numpy原生向量化操作即可满足需求,全程无Python层的单元格遍历,性能足以支撑千万级元素数组的处理需求,以下是两种常用实现方式:
方式1:原地修改master数组
通过布尔掩码定位master的NoData位置,直接用slave对应位置的值填充:
import numpy as np # 示例数组初始化 master = np.array([ [-1, -1, -1, 2, 2, 2], [-1, -1, -1, 2, 2, 2], [-1, -1, -1, 2, 2, 2], [ 2, 2, 2, -1, -1, -1], [ 2, 2, 2, -1, -1, -1], [ 2, 2, 2, -1, -1, -1] ]) slave = np.array([ [-1, -1, -1, 3, 3, 3], [-1, -1, -1, 3, 3, 3], [-1, -1, -1, 3, 3, 3], [ 3, 3, 3, 3, 3, 3], [ 3, 3, 3, 3, 3, 3], [ 3, 3, 3, 3, 3, 3] ]) # 生成NoData位置的布尔掩码 nodata_mask = master == -1 # 原地填充 master[nodata_mask] = slave[nodata_mask]
运行后master的值和你预期的result完全一致。
方式2:生成新数组,不修改原master
用np.where函数一行实现,逻辑更简洁:
result = np.where(master == -1, slave, master)
多slave数组优先级填充方案
如果有多个优先级不同的slave数组,按优先级从高到低依次处理即可:
# 假设slave1优先级最高,slave2次之,依次类推 result = master.copy() for slave in [slave1, slave2, slave3]: nodata_mask = result == -1 # 仅填充当前还为NoData的位置 result[nodata_mask] = slave[nodata_mask] # 无剩余NoData时提前终止循环 if not nodata_mask.any(): break
以上所有操作底层均为C实现,单个数组1200万元素的处理耗时在毫秒级,完全符合业务性能要求。
内容的提问来源于stack exchange,提问作者Florian Beyer
相关产品推荐
相关产品推荐

