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

如何对Numpy二维数组基于值>1的区域进行[1:-1]切片并修改值?

实现每行中大于1的区域内部加1000的方法

原代码的逻辑是先截取整个中间子数组(去掉首尾行、首尾列),再修改其中大于1的值,但这和你想要的「针对每行中大于1的连续区域,仅修改该区域的内部部分(去掉首尾元素)」逻辑不符。以下是可行的实现方案:

实现步骤

  1. 遍历数组的每一行
  2. 标记每行中值大于1的位置
  3. 找出这些位置的连续区域边界
  4. 对长度≥3的连续区域,修改其内部([1:-1]部分)的值,加1000

完整代码

import numpy as np

# 初始化示例数组
example_array = np.array([
    [0, 0, 0, 1, 1, 0, 0, 0],
    [0, 0, 2, 2, 2, 2, 0, 0],
    [0, 3, 3, 3, 3, 0, 0, 0],
    [4, 4, 4, 4, 4, 4, 0, 0],
    [0, 0, 0, 5, 5, 0, 0, 0]
])

for row in example_array:
    # 标记当前行中值大于1的位置
    mask = row > 1
    # 计算掩码的变化点,找到连续区域的起止索引
    diff = np.diff(np.concatenate([[False], mask, [False]]))
    start_indices = np.where(diff[:-1])[0]
    end_indices = np.where(diff[1:])[0]
    
    # 处理每个连续的大于1的区域
    for s, e in zip(start_indices, end_indices):
        region_length = e - s
        # 只有区域长度≥3时,[1:-1]才有元素可修改
        if region_length >= 3:
            # 对区域内部(去掉首尾元素)加1000
            row[s+1 : e-1] += 1000

# 输出结果
print(example_array)

代码说明

  • mask = row > 1:生成当前行的布尔掩码,标记哪些位置的值大于1
  • diff = np.diff(...):通过拼接掩码的首尾边界,计算掩码的变化点,从而定位连续区域的起始和结束位置
  • row[s+1 : e-1] += 1000:针对每个长度足够的连续区域,取其内部部分(去掉区域的第一个和最后一个元素)执行加1000操作

运行后得到符合预期的目标数组:

[[   0    0    0    1    1    0    0    0]
 [   0    0    2 1002 1002    2    0    0]
 [   0    3 1003 1003    3    0    0    0]
 [   4 1004 1004 1004 1004    4    0    0]
 [   0    0    0    5    5    0    0    0]]

内容的提问来源于stack exchange,提问作者Patstro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:33:26