NumPy中的meshgrid函数:生成网格坐标点(网格数组)
创作时间:
作者:
@小白创作中心
NumPy中的meshgrid函数:生成网格坐标点(网格数组)
引用
CSDN
1.
https://blog.csdn.net/u013172930/article/details/144832452
NumPy中的
meshgrid
函数是用于生成网格坐标点(网格数组)的重要工具,广泛应用于多维坐标采样和可视化任务。本文将详细介绍meshgrid
函数的基本概念、参数说明、使用示例及其常见应用场景,帮助读者全面掌握这一实用功能。
1. 基本概念
np.meshgrid
是NumPy提供的一款用于生成网格坐标点(网格数组)的函数,常用于对多维坐标进行采样或者可视化。在二维情况下,它可以帮助我们根据给定的一维坐标数组,生成对应的二维网格坐标矩阵;在三维甚至更高维的情况下,也同理。
举个简单的二维例子,假设我们有两个一维坐标向量:
x = [x1, x2, x3, ...]
y = [y1, y2, y3, ...]
希望得到一个二维网格上所有的(x, y)点对。传统上,我们可能用双层循环去生成所有组合,但np.meshgrid
可以一次性搞定并返回两个矩阵X和Y:
- X矩阵的每一行都拷贝了向量x;
- Y矩阵的每一列都拷贝了向量y。
这样就能得到网格中所有点的坐标组合。
2. 函数签名
numpy.meshgrid(*xi, copy=True, sparse=False, indexing='xy')
参数说明
*xi
:可以是一组一维坐标数组,如x, y
,或x, y, z
等。copy
:是否返回数组的副本(默认True
),若设为False
,则可能返回一个视图(view),减少不必要的内存开销。sparse
:若设为True
,则返回“稀疏”网格,网格维度会降低,以节省空间。indexing
:'xy'
表示传统的笛卡尔坐标;'ij'
表示将首个坐标对应到矩阵的行(i方向),第二个坐标对应到矩阵的列(j方向)。
3. 示例
3.1 二维示例
以下示例展示了如何使用np.meshgrid
生成二维网格坐标点,并可视化这些点的分布情况。
import numpy as np
import matplotlib.pyplot as plt
# 定义一维坐标
x = np.linspace(-2, 2, 5) # [-2, -1, 0, 1, 2]
y = np.linspace(-2, 2, 5)
# 使用 meshgrid 生成网格
X, Y = np.meshgrid(x, y, indexing='xy')
print("X:\n", X)
print("Y:\n", Y)
# 可视化网格点
plt.scatter(X, Y, color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('2D Grid Points')
plt.grid(True)
plt.show()
结果解读:
- 打印的
X
矩阵中,每一行都拷贝了向量x:
X:
[[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]]
- 打印的
Y
矩阵中,每一列都拷贝了向量y:
Y:
[[-2. -2. -2. -2. -2.]
[-1. -1. -1. -1. -1.]
[ 0. 0. 0. 0. 0.]
[ 1. 1. 1. 1. 1.]
[ 2. 2. 2. 2. 2.]]
- 可视化结果是一个5×5的网格点,其中红点的坐标正是(x, y)的全部组合。
3.2 三维示例
当需要在三维空间生成网格坐标时,可以传入三个一维数组给np.meshgrid
:
import numpy as np
x = np.linspace(0, 1, 3)
y = np.linspace(0, 2, 3)
z = np.linspace(0, 3, 3)
X, Y, Z = np.meshgrid(x, y, z, indexing='xy')
print("X.shape:", X.shape) # (3, 3, 3)
print("Y.shape:", Y.shape) # (3, 3, 3)
print("Z.shape:", Z.shape) # (3, 3, 3)
这里X
、Y
、Z
都是(3, 3, 3)的三维数组,代表所有(x, y, z)的坐标组合。
3.3 稀疏网格(sparse=True
)
如果只想在计算或存储上更节省,可以使用稀疏网格:
import numpy as np
x = np.linspace(0, 1, 3)
y = np.linspace(0, 2, 3)
X_sparse, Y_sparse = np.meshgrid(x, y, sparse=True)
print("X_sparse shape:", X_sparse.shape) # (1, 3)
print("Y_sparse shape:", Y_sparse.shape) # (3, 1)
- 当
sparse=True
时,返回的网格并不会真的复制出所有坐标组合,而是使用广播机制,在需要时才会“展开”。对于大规模数据场景,这种方式可以显著减少内存占用。
4. 常见用途
函数可视化
在二维或三维情况下,我们通常会用(X, Y)
、(X, Y, Z)
来计算函数值并进行绘图,比如等高线图(contour)或3D曲面图。计算网格采样
在很多数值计算或模拟中,需要对给定范围内的坐标进行采样,例如在图像处理、数值微分、数值积分中都可使用。坐标转换
与np.mgrid
、np.ogrid
等结合使用,实现更灵活的网格生成。
5. 注意事项
- indexing参数
'xy'
:默认值,表示生成的矩阵X
的shape是(len(y), len(x))
,对二维常用。'ij'
:表示矩阵X
的shape是(len(x), len(y))
,更多用于多维数组的情况。
- 内存占用
- 对于大规模坐标网格,网格本身可能占用很大内存。
- 可以使用
sparse=True
或者copy=False
来避免不必要的复制或展开。
- 与绘图库的配合
- 在使用matplotlib绘制2D/3D图时,经常需要网格坐标,例如
ax.contour(X, Y, Z)
。 np.meshgrid
生成的X, Y
可直接用于plt.pcolormesh
、plt.contourf
等函数。
6. 小结
np.meshgrid
可以快速地生成N维坐标网格,是数值计算和可视化中非常常用的功能。- 二维常用于绘制等高线图、散点图等;三维或更高维也可用于多维数据分析与可视化。
- 要注意网格大小和内存使用,如果数据规模很大,可以使用
sparse=True
来减少内存占用。
热门推荐
基金买卖全攻略:从普通基金到ETF,这些技巧助你把握投资时机
《摩尔庄园》霸气归来:持续霸榜、营收破亿,童年情怀IP游戏的火热与隐忧
全面解析:工伤赔偿各级标准及更高赔偿额度一览
文学作品的创作动机分析
定金与保证金及预付款有什么区别
锂电池VS铅酸电池:同容量下,为何锂电池能跑得更远?
膝关节肿胀疼痛是因为“积水”了?
5部法国情调满满的电影,大概只有法国才能拍得出这些片
预售合同资金断裂如何维权?一文详解法律责任与合同查询
秦朝的政治制度及其历史影响
炒鞋现象引发关注:是投资还是传销?
风光互补发电系统案例解析
哪些材质的包装纸箱可以回收再利用?
如何自行进行汽车打蜡?这种保养对车辆外观有何重要性?
谁是青岛第三海底隧道的“受益者”?
铁路部门提示新规:每位旅客行李限重20KG,超出需缴费
江苏徐州:一条“美丽农路”串起乡村发展好风光
红豆薏米不煮熟可以直接喝吗?专家为你解答
股东权益怎么计算:从公式到法律保障的全面解析
为什么德国和北欧高校成为2024年留学的主流目的地?
电影《金刚川》,影片中的叙事创新,让人眼前一亮
如何把钙补到位?药师教你科学使用钙补充剂
牙龈反复出血怎么办?医生提醒:这6个治疗方法,守护你牙龈健康
零基础也能拿证!ASFC无人机驾驶员证报考全攻略,手把手教你飞上天!
新鲜肉类冰箱保存全攻略:从准备到注意事项一文详解
中国10大示范步行街,南北大不同,都是城市的精华,你去过几个?
煤矿安全生产综合信息:保障矿业安全,促进可持续发展
宝宝敏感肌护理全攻略:从清洁到保湿,告别红脸蛋
湿气重的人,建议这样调理
小体积,大能量:GIS在现代电力系统的关键角色