numpy库学习之np.meshgrid函数
一、简介
np.meshgrid
是 NumPy 库中的一个函数,用于从坐标向量构造网格。这在多维函数的评估、数据可视化等方面非常有用。np.meshgrid
可以生成二维或更高维度的网格,其中每个维度的值都来自相应的一维数组。
二、语法和参数
np.meshgrid
的基本语法如下:
python
numpy.meshgrid(*xi, indexing='xy', sparse=False)
*xi
:一系列数组,表示每个维度的坐标点。indexing
:一个字符串,指定索引的顺序。'xy'表示第一个维度是x轴,第二个维度是y轴;'ij'表示第一个维度是行,第二个维度是列。sparse
:布尔值,如果为True,则返回稀疏的网格,即只包含坐标数组,而不是完整的网格矩阵。
三、实例
3.1 基本二维网格
python
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6, 7])
X, Y = np.meshgrid(x, y)
print("X:")
print(X)
print("Y:")
print(Y)
输出:
X:
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
Y:
[[4 4 4]
[5 5 5]
[6 6 6]
[7 7 7]]
3.2 使用索引顺序
python
X, Y = np.meshgrid(x, y, indexing='ij')
print("X (indexing='ij'):")
print(X)
print("Y (indexing='ij'):")
print(Y)
输出:
X (indexing='ij') :
[[1 1 1]
[2 2 2]
[3 3 3]]
Y (indexing='ij') :
[[4 5 6]
[4 5 6]
[4 7 7]]
3.3 稀疏网格
python
X_sparse, Y_sparse = np.meshgrid(x, y, sparse=True)
print("X (sparse=True):")
print(X_sparse)
print("Y (sparse=True):")
print(Y_sparse)
输出:
X (sparse=True):
[[1 2 3]]
Y (sparse=True):
[[4]
[5]
[6]
[7]]
四、注意事项
np.meshgrid
可以用于生成多维网格,但在此示例中只展示了二维网格的用法。- 当使用
indexing='ij'
时,生成的网格将按照矩阵索引的方式排列,即第一个索引变化得更快。 sparse
参数设置为True时,可以节省内存,但返回的不是完整的网格矩阵,而是坐标点的索引。- 在某些情况下,如果输入数组的长度不一致,
np.meshgrid
会广播较短的数组以匹配较长的数组,以生成完整的网格。
五、原理解释
np.meshgrid
函数生成网格的原理基于笛卡尔积的概念。笛卡尔积是集合论中的一个概念,学过离散数学的同学都知道,表示两个集合所有可能的有序对的集合。
在 np.meshgrid
的上下文中,它意味着将两个一维数组的所有元素进行配对,形成二维网格。
5.1原理说明
假设有两个一维数组 x
和 y
:
x = [x1, x2, ..., xn]
y = [y1, y2, ..., ym]
np.meshgrid
将这些数组的元素配对,形成 n
行 m
列的网格。具体来说:
- 对于
x
中的每个元素xi
,它将与y
中的所有元素进行配对。 - 同理,
y
中的每个元素yj
也将与x
中的所有元素进行配对。
5.2 以二维网格为例
-
生成 X 轴网格 :对于
x
中的每个元素,将其复制n
次,形成n
行,每列有n
个相同的xi
。 -
生成 Y 轴网格 :对于
y
中的每个元素,将其复制m
次,形成m
列,每行有m
个相同的yj
。 -
组合成网格 :将步骤1和步骤2的结果组合起来,形成
n
行m
列的二维网格。
5.3 示例
假设 x = [1, 2]
和 y = [3, 4, 5]
,那么:
x
的每个元素都与y
中的所有元素配对。y
的每个元素都作为一列,与x
中的所有元素配对。
python
import numpy as np
x = np.array([1, 2])
y = np.array([3,4, 5])
X, Y = np.meshgrid(x, y)
print("X:")
print(X)
print("Y:")
print(Y)
组合后的网格为:
X:
[[1 2]
[1 2]
[1 2]]
Y:
[[3 3]
[4 4]
[5 5]]
这表示每个 (xi, yj)
的配对,形成了一个完整的二维网格。
注意事项
- 当
indexing='ij'
时,网格的排列顺序是先按行变化,再按列变化,这与矩阵的索引方式一致。 - 稀疏网格(
sparse=True
)只返回坐标轴上的值,而不是完整的网格矩阵,这可以节省内存,特别是在处理高维数据时。如上例的稀疏化表示为:
python
X:
[[1]
[2]]
Y:
[[3 4 5]]