如何将Python二维数组以指定索引为中心填充至目标尺寸?
高效实现指定中心的二维数组填充(基于NumPy)
针对你需要将动态扩展的二维网格填充到固定大尺寸数组,且保持原数组指定索引为目标数组中心的需求,这里提供一个基于NumPy的高效实现方案,避免逐元素赋值的低效问题。
核心思路
- 先创建全为
-1(未探索区域)的目标大数组; - 根据原数组的指定中心坐标,计算原数组在目标数组中的放置位置,确保原数组的指定索引与目标数组的中心对齐;
- 利用NumPy的切片批量赋值完成填充(底层C实现,效率远高于Python循环)。
代码实现
import numpy as np def pad_to_center(src_arr, max_width, max_height, src_center): # 初始化全为-1的目标数组,匹配原数组的数据类型 target_arr = np.full((max_height, max_width), -1, dtype=src_arr.dtype) # 获取原数组的高、宽,以及指定的中心坐标(y轴在前,对应数组的行索引) h1, w1 = src_arr.shape src_y, src_x = src_center # 计算原数组在目标数组中的起始放置坐标 start_y = (max_height // 2) - src_y start_x = (max_width // 2) - src_x # 计算结束坐标(起始坐标+原数组尺寸) end_y = start_y + h1 end_x = start_x + w1 # 批量赋值,高效完成填充 target_arr[start_y:end_y, start_x:end_x] = src_arr return target_arr
示例验证
测试场景1:指定原数组中心为(1,1)
# 原3×3网格 src = np.array([ [-1, 0, 5], [0, 0, 0], [5, 5, 5] ]) # 填充为5×5数组,原数组(1,1)为中心 result = pad_to_center(src, 5, 5, (1, 1)) print(result)
输出结果:
[[-1 -1 -1 -1 -1] [-1 -1 0 5 -1] [-1 0 0 0 -1] [-1 5 5 5 -1] [-1 -1 -1 -1 -1]]
测试场景2:指定原数组中心为(0,0)
result = pad_to_center(src, 5, 5, (0, 0)) print(result)
输出结果:
[[-1 -1 -1 -1 -1] [-1 -1 -1 -1 -1] [-1 -1 -1 0 5] [-1 -1 0 0 0] [-1 -1 5 5 5]]
适配你的RL场景说明
- 针对你动态扩展的地图(从100×80逐步增大),每次地图更新后调用该函数,即可快速填充到500×500的固定尺寸数组;
- 该方法保证原地图的指定中心始终处于目标数组的中心位置,避免因地图扩展导致的内容平移,符合你"从中心向外扩展"的需求;
- 切片赋值为NumPy原生批量操作,无Python循环开销,适合强化学习训练中每一步的高效计算。
内容的提问来源于stack exchange,提问作者nohacks
相关产品推荐
相关产品推荐

