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

NumPy数组如何替换上方、左侧相邻元素均为5的数值4

NumPy 按相邻元素条件替换数组值实现方案

实现思路

不需要逐元素循环遍历,直接利用NumPy的切片偏移特性做矢量化判断即可,性能远高于手写循环,同时自动规避数组边界越界问题:

  • 目标替换元素必须同时满足3个条件:
    • 元素自身取值为4
    • 元素正上方相邻位置取值为5
    • 元素正左侧相邻位置取值为5
  • 由于第一行元素无上方邻居、第一列元素无左侧邻居,天然不满足替换条件,直接从第2行第2列(0索引下的[1:,1:]切片)开始判断即可,不会出现索引越界。

完整实现代码

import numpy as np

# 1. 处理输入为NumPy整数数组(如果已经是数值数组可跳过这步)
input_str = """0000300 
0005000
0054000
0000045
0002050"""
arr = np.array(
    [[int(c) for c in line.strip()] for line in input_str.splitlines()],
    dtype=int
)
result = arr.copy()  # 拷贝数组避免修改原数据

# 2. 生成替换掩码:三个条件同时为True的位置才需要替换
# 切片对齐逻辑:
# result[1:, 1:] 对应所有可能有上、左邻居的元素位置
# result[:-1, 1:] 对应上述位置的正上方邻居
# result[1:, :-1] 对应上述位置的正左侧邻居
replace_mask = (
    (result[1:, 1:] == 4)
    & (result[:-1, 1:] == 5)
    & (result[1:, :-1] == 5)
)

# 3. 执行替换
result[1:, 1:][replace_mask] = 8

# 如果需要转回和输入一致的每行数字串格式,用下面代码
output_str = '\n'.join(''.join(row.astype(str)) for row in result)
print(output_str)

示例运行说明

针对给出的测试用例,代码会正确定位到第三行第四列(0索引位置(2,3))的4:该位置上方是第二行第四列的5,左侧是第三行第三列的5,满足替换条件,会被替换为8,其余元素保持原值。

注:给出的预期输出最后一行为0002000,和「其余元素保持原值不变」的规则冲突(原输入最后一行第6位是5,无符合条件的替换触发逻辑),属于示例笔误,代码运行后对应位置会保留原值5,最后一行输出为0002050。

内容的提问来源于stack exchange,提问作者Loïc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:09:15