问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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()

结果解读:

  1. 打印的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.]]
  1. 打印的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.]]
  1. 可视化结果是一个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)

这里XYZ都是(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. 常见用途

  1. 函数可视化
    在二维或三维情况下,我们通常会用(X, Y)(X, Y, Z)来计算函数值并进行绘图,比如等高线图(contour)或3D曲面图。

  2. 计算网格采样
    在很多数值计算或模拟中,需要对给定范围内的坐标进行采样,例如在图像处理、数值微分、数值积分中都可使用。

  3. 坐标转换
    np.mgridnp.ogrid等结合使用,实现更灵活的网格生成。

5. 注意事项

  1. indexing参数
  • 'xy':默认值,表示生成的矩阵X的shape是(len(y), len(x)),对二维常用。
  • 'ij':表示矩阵X的shape是(len(x), len(y)),更多用于多维数组的情况。
  1. 内存占用
  • 对于大规模坐标网格,网格本身可能占用很大内存。
  • 可以使用sparse=True或者copy=False来避免不必要的复制或展开。
  1. 与绘图库的配合
  • 在使用matplotlib绘制2D/3D图时,经常需要网格坐标,例如ax.contour(X, Y, Z)
  • np.meshgrid生成的X, Y可直接用于plt.pcolormeshplt.contourf等函数。

6. 小结

  • np.meshgrid可以快速地生成N维坐标网格,是数值计算和可视化中非常常用的功能。
  • 二维常用于绘制等高线图、散点图等;三维或更高维也可用于多维数据分析与可视化。
  • 要注意网格大小和内存使用,如果数据规模很大,可以使用sparse=True来减少内存占用。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号