tags: [笔记, Numpy, np.meshgrid()]
categories: [笔记, Numpy, np.meshgrid()]


语法

numpy.meshgrid(*xi, copy=True, sparse=False, indexing=’xy’)

功能

当传入的参数是两个的时候,meshgrid函数就是用两个坐标轴上的点在平面上画网格。当然我们可以指定多个参数,比如三个参数,那么就是用用三个一维的坐标轴上的点在三维平面上画网格。

参数

x1, x2,…, xn: array_like
一维数组,表示网格的坐标。这里可以传入多个一维数组的值。但是这里需要注意的就是如果我们给传入的是一个矩阵(多维数组)的话,他会自动把这个矩阵转换成一维数组。
indexing: {‘xy’, ‘ij’}, optional
输出的形状基于笛卡尔(‘ xy ‘,默认)或矩阵(‘ ij ‘)索引。详情请看下面的“注意”。
sparse: bool, optional
如果为True,则返回一个稀疏网格以节省内存。 默认值为False。
copy: bool, optional
如果为False,则返回原始数组的视图以节省内存。默认是正确的。请注意,sparse=False, copy=False可能会返回不连续的数组。此外,广播数组的多个元素可以引用单个内存位置。如果需要写入数组,请先复制。

返回

X1, X2,…, XN: ndarray
对于长度为Ni=len(xi)的向量x1, x2,…,’ xn ‘,如果index = ‘ ij ‘则返回(N1, N2, N3,…Nn)形状的数组,如果index = ‘ xy ‘则返回(N2, N1, N3,…Nn)形状的数组,用对应xi的元素重复填充矩阵的第一个维度x1,第二个维度x2,以此类推。

注意

该函数通过indexing关键字参数支持这两种索引约定。给定字符串’ ij ‘将返回一个带有矩阵索引的网格,而’ xy ‘将返回一个带有笛卡尔索引的网格。在输入长度为M和N的二维情况下,输出为xy索引的形状(N, M)和ij索引的形状(M, N)。在输入长度为M, N和P的3-D情况下,输出为xy索引的形状(N, M, P)和ij索引的形状(M, N, P)。在1维和0维情况下,索引和稀疏两个参数的设置则没有影响。

用法

  1. xv,yv = meshgrid(x,y)
  2. xv,yv = meshgrid(x)与xv,yv = meshgrid(x,x)是等同的
  3. xv,yv,zv = meshgrid(x,y,z)生成三维数组,可用来计算三变量的函数和绘制三维立体图

    例1 indexing参数

    indexing参数有两个值’xy’和’ij’,默认值为’xy’。其中’xy’代表的是笛卡尔,’ij’代表的是矩阵。通过下面代码查看两者的区别: ```python import numpy as np x = np.array([1,2,3]) y = np.array([4,5,6,7]) xv,yv = np.meshgrid(x,y,indexing = ‘xy’) xv2,yv2 = np.meshgrid(x,y,indexing = ‘ij’) print(‘——-向量的形状——-‘) print(x.shape) print(y.shape)

print(‘——-xy——-‘) print(xv.shape) print(yv.shape)

print(‘——-ij——-‘) print(xv2.shape) print(yv2.shape)

  1. ```python
  2. -----向量的形状-----
  3. (3,)
  4. (4,)
  5. -----xy-----
  6. (4, 3)
  7. (4, 3)
  8. -----ij-----
  9. (3, 4)
  10. (3, 4)

总结一下,对于二维数组来说,对于两个长度为3和4的一维数组,我们设N = 3 ,M = 4。对于我们indexing = ‘xy’(默认)来说,得到xv以及yv矩阵的形状是(M,N)也就是(4,3);那对于indexing = ‘ij’我们的xv以及yv矩阵的形状是(N,M)也就是(3,4)。

那对于三维来说,参数是三个一维数组,并且一维数组的形状分别是N,M,P,那么如果indexing = ‘xy’的话返回的三个矩阵xv,yv,zv的形状都是(M,N,P);如果indexing = ‘ij’的话返回的是三个矩阵xv,yv,zv的形状都是(N,M,P)。

另外,其实不管用’xy’还是’ij’, 生成的网格坐标都是同样的

例2 np.meshgrid()+plt.contourf

np.meshgrid()生成网格坐标之后,可以配合plt.contourf()生成填充的等高线图.

  1. nx, ny = (3, 2)
  2. x = np.linspace(0, 1, nx)
  3. y = np.linspace(0, 1, ny)
  4. xv, yv = np.meshgrid(x, y)
  5. xv
  6. array([[0. , 0.5, 1. ],
  7. [0. , 0.5, 1. ]])
  8. yv
  9. array([[0., 0., 0.],
  10. [1., 1., 1.]])
  11. xv, yv = np.meshgrid(x, y, sparse=True) # make sparse output arrays
  12. xv
  13. array([[0. , 0.5, 1. ]])
  14. yv
  15. array([[0.],
  16. [1.]])
  1. import matplotlib.pyplot as plt
  2. x = np.arange(-5, 5, 0.1)
  3. y = np.arange(-5, 5, 0.1)
  4. xx, yy = np.meshgrid(x, y, sparse=True)
  5. z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
  6. h = plt.contourf(x,y,z)
  7. plt.show()

image.png