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维情况下,索引和稀疏两个参数的设置则没有影响。
用法
- xv,yv = meshgrid(x,y)
- xv,yv = meshgrid(x)与xv,yv = meshgrid(x,x)是等同的
- 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)
```python
-----向量的形状-----
(3,)
(4,)
-----xy-----
(4, 3)
(4, 3)
-----ij-----
(3, 4)
(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()生成填充的等高线图.
nx, ny = (3, 2)
x = np.linspace(0, 1, nx)
y = np.linspace(0, 1, ny)
xv, yv = np.meshgrid(x, y)
xv
array([[0. , 0.5, 1. ],
[0. , 0.5, 1. ]])
yv
array([[0., 0., 0.],
[1., 1., 1.]])
xv, yv = np.meshgrid(x, y, sparse=True) # make sparse output arrays
xv
array([[0. , 0.5, 1. ]])
yv
array([[0.],
[1.]])
import matplotlib.pyplot as plt
x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
h = plt.contourf(x,y,z)
plt.show()