如何对Numpy二维数组基于值>1的区域进行[1:-1]切片并修改值?
实现每行中大于1的区域内部加1000的方法
原代码的逻辑是先截取整个中间子数组(去掉首尾行、首尾列),再修改其中大于1的值,但这和你想要的「针对每行中大于1的连续区域,仅修改该区域的内部部分(去掉首尾元素)」逻辑不符。以下是可行的实现方案:
实现步骤
- 遍历数组的每一行
- 标记每行中值大于1的位置
- 找出这些位置的连续区域边界
- 对长度≥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:生成当前行的布尔掩码,标记哪些位置的值大于1diff = 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
相关产品推荐
相关产品推荐

