如何优化Numpy数组中两点间路径坐标的生成代码?
优化两点间指定路径的生成实现
需求回顾
给定包含1的NumPy数组,需要生成从第一个1的坐标到第二个1的坐标的路径坐标:先沿行方向移动至目标行,再沿列方向移动至目标列,路径需包含所有中间点及起止点。
原代码存在的问题
你当前的walking函数存在几个明显缺陷:
- 直接修改输入的
start列表,会导致外部变量被意外篡改,产生副作用 - 循环范围逻辑错误:仅当
end[0]为正数时才会执行行移动,若起始行大于目标行(比如从行3到行1),循环不会执行;且未包含起始点 - 列移动逻辑错误:直接重复打印
end,没有逐步生成列方向的中间点
更优实现方案
下面提供两种可靠的实现方式,分别适配纯Python场景和NumPy向量化场景:
方案1:纯Python实现(通用场景,支持所有方向移动)
def generate_path(start, end): path = [] current_row, current_col = start # 处理行方向移动:覆盖从起始行到目标行的所有行,列保持起始列 step_row = 1 if end[0] > current_row else -1 if end[0] < current_row else 0 for row in range(current_row, end[0] + step_row, step_row): path.append([row, current_col]) # 处理列方向移动:跳过已添加的目标行起始列点,生成到目标列的所有点 if current_col != end[1]: step_col = 1 if end[1] > current_col else -1 if end[1] < current_col else 0 for col in range(current_col + step_col, end[1] + step_col, step_col): path.append([end[0], col]) return path
测试示例:
- 示例1:
generate_path([0,1], [2,1])返回[[0,1], [1,1], [2,1]],符合预期 - 示例2:
generate_path([0,2], [4,4])返回[[0,2], [1,2], [2,2], [3,2], [4,2], [4,3], [4,4]],符合预期 - 反向移动测试:
generate_path([4,4], [0,2])返回[[4,4], [3,4], [2,4], [1,4], [0,4], [0,3], [0,2]],逻辑正确
该方案的优势:
- 不修改输入参数,避免副作用
- 支持行、列的正负方向移动(从上到下/从下到上,从左到右/从右到左)
- 逻辑清晰,易读易维护
方案2:NumPy向量化实现(大数据量场景更高效)
如果需要处理大量坐标点,利用NumPy的向量化操作可以提升效率:
import numpy as np def generate_path_np(start, end): # 生成行方向所有点 row_range = np.arange(start[0], end[0] + 1, 1 if end[0] > start[0] else -1) row_points = np.column_stack((row_range, np.full(len(row_range), start[1]))) # 生成列方向所有点(跳过已包含的终点行起始列) path = row_points if start[1] != end[1]: col_step = 1 if end[1] > start[1] else -1 col_range = np.arange(start[1] + col_step, end[1] + col_step, col_step) col_points = np.column_stack((np.full(len(col_range), end[0]), col_range)) path = np.vstack((row_points, col_points)) return path.tolist()
测试示例:
调用generate_path_np([0,2], [4,4])会得到与示例2完全一致的路径列表。
内容的提问来源于stack exchange,提问作者justTrying
相关产品推荐
相关产品推荐

