如何基于Numpy高效实现网格点与像素坐标的叠加?
高效实现网格点与形状坐标的批量相加
核心实现代码
用Numpy的广播机制可以高效完成这个需求,避免低效的循环操作,代码如下:
import numpy as np # 将输入列表转为Numpy数组 myarray = np.array([[0,0],[1,1],[2,2]]) mygrid = np.array([[70,70],[100,100],[30,30]]) # 广播相加 + 展平得到目标数组 desired_result = (myarray[np.newaxis, :, :] + mygrid[:, np.newaxis, :]).reshape(-1, 2)
代码解释
- 维度扩展:通过
np.newaxis给myarray增加一个维度(变为(1, 3, 2)),给mygrid增加一个维度(变为(3, 1, 2)) - 广播相加:Numpy会自动将两个数组扩展为
(3, 3, 2)的形状,对应每个网格点与每个形状点逐一相加 - 展平结果:用
reshape(-1, 2)把三维数组转成二维,得到你想要的[[70,70],[71,71],...]格式
运行后输出的desired_result完全匹配预期。
生成像素网格的扩展应用
如果要生成带形状的像素网格,可以按以下步骤操作:
# 确定坐标范围,取所有结果中的最大值+1(假设坐标从0开始) max_coord = desired_result.max() + 1 # 创建全1矩阵 grid_matrix = np.ones((max_coord, max_coord), dtype=int) # 提取目标坐标的x、y值 x = desired_result[:, 0] y = desired_result[:, 1] # 将对应位置设为0 grid_matrix[y, x] = 0
这样就得到了每个网格点位置带有1x3像素块的矩阵。
扩展到其他几何形状
只需替换myarray为对应几何形状的坐标集合即可,比如生成圆形的坐标点:
# 生成半径为2的圆形坐标点(筛选满足x²+y²≤r²的点) radius = 2 xs, ys = np.meshgrid(np.arange(-radius, radius+1), np.arange(-radius, radius+1)) circle_points = np.column_stack((xs.flatten(), ys.flatten()))[xs**2 + ys**2 <= radius**2] # 用同样的方法生成圆形网格 circle_grid = (circle_points[np.newaxis, :, :] + mygrid[:, np.newaxis, :]).reshape(-1, 2)
内容的提问来源于stack exchange,提问作者100xln2
相关产品推荐
相关产品推荐

