numpy 中的 meshgrid() 函数能够生成坐标网格点,作为后续操作的输入,如画二元函数等高线图等。但它的理解却有些困难,本篇以 Jupyterlab 为平台演示,帮助理解该函数。

直观理解

请看下图,矩阵 (1) 为输入,其中[1, 2, 3] 为 $x$ 轴坐标,[6, 5, 4] 为 $y$ 轴坐标,里面的点 $\cdot$ 为有待求得的网格点。矩阵 (2) 为网格点矩阵,每个元素为该坐标处的 $(x, y)$ 坐标。两个矩阵 ($xv$), ($yv$) 分别为 np.meshgrid() 函数返回的 $x$ 坐标点矩阵和 $y$ 坐标点矩阵。

$$
\begin{matrix}
6 & . & . & . \\
5 & . & . & . \\
4 & . & . & . \\
& 1 & 2 & 3
\end{matrix} \tag{1}
$$

$$
\left[
\begin{matrix}
(1, 6) & (2, 6) & (3, 6) \\
(1, 5) & (2, 5) & (3, 5) \\
(1, 4) & (2, 4) & (3, 4)
\end{matrix}
\right]\tag{2}
$$

$$
\left[
\begin{matrix}
1 & 2 & 3 \\
1 & 2 & 3 \\
1 & 2 & 3
\end{matrix}
\right]\tag{xv}
$$

$$
\left[
\begin{matrix}
6 & 6 & 6 \\
5 & 5 & 5 \\
4 & 4 & 4
\end{matrix}
\right]\tag{yv}
$$

1
import numpy as np
1
2
3
4
x = np.array([1, 2, 3])
y = np.array([6, 5, 4])
xv, yv = np.meshgrid(x, y)
xv
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])
1
yv
array([[6, 6, 6],
       [5, 5, 5],
       [4, 4, 4]])

示例

1
2
import matplotlib.pyplot as plt
import numpy as np
1
2
3
4
5
def circ(x, y):
"""
计算坐标点(x, y)距离圆心(0, 0)的距离平方
"""
return np.power(x, 2) + np.power(y, 2)
1
2
3
4
x = np.linspace(-np.pi, np.pi, 20)
y = np.linspace(-np.pi, np.pi, 20)
xv, yv = np.meshgrid(x, y)
z = circ(xv, yv)

画网格点

1
2
plt.plot(xv, yv, marker=".", color="r", linestyle="none")
plt.show()

网格点

画等高线

1
2
3
4
plt.contourf(x, y, z)
plt.axis("scaled")
plt.colorbar()
plt.show()

等高线

画近似等高线图

1
2
plt.imshow(z, origin="lower", interpolation="none")
plt.show()

近似等高线图

参考文献

  1. 理解numpy中的meshgrid()方法
  2. numpy.meshgrid