You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:57:00