Numpy中关于Meshgrid函数:meshgrid官方。
1.Meshgrid前言
meshgrid函数就是用两个坐标轴上的点在平面上画网格(当然这里传入的参数是两个的时候)。当然我们可以指定多个参数,比如三个参数,那么我们的就可以用三个一维的坐标轴上的点在三维平面上画网格。
2.Meshgrid的参数numpy.meshgrid(* xi,** kwargs ) 。array_like代表网格坐标的一维数组,这里可以传入多个一维数组的值。但是这里需要注意的就是如果我们给传入的是一个矩阵(多维数组)的话,他会自动把这个矩阵转换成一维数组;
索引(indexing):('xy'[笛卡尔],'ij'[矩阵]),可选。默认是'xy',下面会详细解释一下;
稀疏(sparse):bool,可选。默认为False。如果为True为了节省内存会返回一个稀疏矩阵;
复制(copy):bool,可选。默认为True。如果为False则为了节省内存返回源始的视图。
返回值: :ndarray。对于二维数组来说,我们的参数是
两个一维数组,我们设
形状为N,
的形状为M。那么他的返回值是一个list列表,里面存放着两个矩阵,我们可以通过解包操作来获取
与
两个矩阵,这里的返回值
,
。我们指定了indexing参数,如果indexing = 'xy'(默认)我们返回的
与
矩阵的形状是(M,N);如果indexing = 'ij'的话我们返回的
与
矩阵的形状就是(N,M)。
3.indexing参数
上面介绍了indexing参数有两个值'xy'和'ij',默认值为'xy'。那他们两个之间有什么区别呢?其中'xy'代表的是笛卡尔,'ij'代表的是矩阵。我们直接通过结果来看。
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)
-----向量的形状-----
(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)
import numpy as np
x = np.array([1,2,3])
y = np.array([4,5,6,7])
xv, yv = np.meshgrid(x, y, sparse=False, indexing='ij')
for i in zip(xv.flat,yv.flat):
print(i)
print('----------')
xv, yv = np.meshgrid(x, y, sparse=False, indexing='xy')
for i in zip(xv.flat,yv.flat):
print(i)运行结果
4.如何使用xv,yv = meshgrid(x,y)
xv,yv = meshgrid(x)与xv,yv = meshgrid(x,x)是等同的
xv,yv,zv = meshgrid(x,y,z)生成三维数组,可用来计算三变量的函数和绘制三维立体图
上面的这些都是直接进行解包后的返回值。其实他返回的是一个list列表,列表中存放的xv,yv,zv的这些numpy数组。
import numpy as np
x = np.array([1,2,3]) #X_{x} = 3
y = np.array([4,5,6,7]) #X_{y} = 4
xv,yv = np.meshgrid( x , y )
print(xv)
print(yv)
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
[[4 4 4]
[5 5 5]
[6 6 6]
[7 7 7]]
我们通过对两个参数来一步一步的分析来看,看得到的结果是如何变成一个网格的:x:表示我们的一维向量(1,2,3),他的N = 3
y:表示我们的一维向量(4,5,6,7),他的N = 4
xv:表示x坐标轴上的坐标矩阵
yv:表示y坐标轴上的坐标矩阵
x = np.array([1,2,3]) #x = (x1,x2,x3)
y = np.array([4,5,6,7]) #y = (y1,y2,y3,y4)
xv,yv = np.meshgrid( x , y )xv矩阵
我们把我们的一维向量
看成了
,我们也可以看上面我输出的xv[[1 2 3]
[1 2 3] [1 2 3] [1 2 3]],如果看成是
,也就是4个向量,如图所示。yv矩阵
我们把我们的y向量看成了
,然后我们从上面的打印出来的结果[[4 4 4] [5 5 5][6 6 6] [7 7 7]],我们的向量被竖着放起,然后推广成三列。正如我们的yv矩阵所示。
我们的两个一维数组形成的网格,我们就可以通过上面的分析得到:网格化数据左边与其对应值