如何快速获取Numpy Meshgrid中每个网格的中点并绘制?
高效生成Meshgrid网格框中点并批量绘制的方法
你可以利用Numpy的矢量运算特性,一次性生成所有网格框的中点坐标,再批量绘制标记点,完全不用逐个处理,效率高很多。
核心思路
原代码仅计算了单个中点,且手动处理间隔,无法批量生成。我们可以直接基于Meshgrid生成的顶点网格,通过矢量运算得到所有网格的中点:
- 因为
linspace生成的是等间隔序列,直接取相邻顶点的差值得到网格步长 - 取顶点网格的前
inputy行、前inputx列(即每个网格的左上角顶点),加上步长的一半就是中点坐标 - 用批量绘制函数一次性完成所有标记点的绘制
完整改进代码
import numpy as np import matplotlib.pyplot as plt # 假设你已定义以下变量:x0, y1, x1, y2, inputx, inputy xg = np.linspace(0, (x1 - x0), inputx + 1) yg = np.linspace(0, (y2 - y1), inputy + 1) xgr, ygr = np.meshgrid(xg, yg) # 计算网格的固定步长 x_step = xg[1] - xg[0] y_step = yg[1] - yg[0] # 一次性生成所有网格的中点坐标(矢量运算,无循环) x_centers = xgr[:-1, :-1] + x_step / 2 y_centers = ygr[:-1, :-1] + y_step / 2 # 绘制画布与原有网格(假设你已实现蓝色网格的绘制) fig, ax = plt.subplots() # 这里添加你原有的网格绘制代码(比如蓝色圆圈网格) # 批量绘制红色中点:用scatter比逐个添加Circle高效得多 ax.scatter(x_centers.flatten(), y_centers.flatten(), c='r', s=25, marker='o') # 如果必须使用Circle对象,也可以批量循环添加(效率稍低) # for x, y in zip(x_centers.flatten(), y_centers.flatten()): # ax.add_patch(plt.Circle((x, y), 5, color='r')) plt.show()
关键细节说明
xgr[:-1, :-1]:Meshgrid生成的顶点矩阵是(inputy+1)×(inputx+1)的维度,去掉最后一行和最后一列后,得到inputy×inputx的矩阵,对应每个网格的左上角顶点- 矢量运算:Numpy会自动对整个矩阵进行加减运算,无需手动循环,处理大网格时速度优势明显
scatter的s参数:对应标记点的大小,原代码中Circle半径为5,这里s=25(约为半径平方的4倍)可以达到近似视觉效果,可根据需求调整
内容的提问来源于stack exchange,提问作者lordclyborne
相关产品推荐
相关产品推荐

