《利用python进行数据分析》——4.3 利用数组进行数据处理——np.meshgrid方法
1.numpy.meshgrid()是什么
numpy.meshgrid()方法定义:
np.meshgrid()函数接受两个一维数组,并产生两个二维矩阵(对应于两个数组中所有的(x,y)对)
numpy.meshgrid(*xi, **kwargs)
Return coordinate matrices from coordinate vectors.
根据输入的坐标向量生成应的坐标矩阵
即:根据输入的,2个坐标向量(一维数组)——生成——2个坐标矩阵(二维矩阵)
举例:
2个向量:a向量=([0,1,2]),b 向量=([0,1])
那么该如何通过这2个向量生成2个二维矩阵?
假定,a向量[0,1,2]作为X轴(x坐标为0,1,2),b向量[0,1]作为Y轴(y坐标为0,1)
生成坐标系如下:
由a向量组成的坐标矩阵=坐标系中所有交点的“横坐标”的集合
由b向量组成的坐标矩阵=坐标系中所有交点的“纵坐标”的集合
即:由a向量组成的坐标矩阵是:[[0,1,2], [0,1,2]]
由b向量组成的坐标矩阵是:[[0,0,0],[1,1,1]
所以我认为,meshgrid方法可以理解为:
根据输入的2个坐标向量(一维数组)——生成坐标系——并将坐标系中所有交点的横、纵坐标的集合(即2个坐标矩阵)返回给调用者
例子如下:
In [1]: import numpy as np
In [8]: a = np.array([0,1,2])# a坐标向量
In [9]: b = np.array([0,1])# b坐标向量
In [10]: res = np.meshgrid(a,b)
# meshgrid()方法根据a,b两个坐标向量,返回两个坐标矩阵(所有横、纵坐标的集合)
In [11]: res
Out[11]:
[array([[0, 1, 2],
[0, 1, 2]]), array([[0, 0, 0],
[1, 1, 1]])]
# meshgrid()返回的res有两个坐标矩阵,第一个坐标矩阵是所有横坐标的集合,第二个坐标矩阵是所有纵坐标的集合
In [12]: res_a,res_b = np.meshgrid(a,b)
In [14]: res_a
Out[14]:
array([[0, 1, 2],
[0, 1, 2]])
# meshgrid()返回有两个坐标矩阵,第一个坐标矩阵res_a是所有横坐标的集合
In [15]: res_b
Out[15]:
array([[0, 0, 0],
[1, 1, 1]])
# meshgrid()返回有两个坐标矩阵,第二个坐标矩阵res_b 是所有纵坐标的集合
2.假设我们想要在一组值(网格型,即二维矩阵/坐标矩阵)上计算函
数sqrt(x^2+y^2)
这是《利用python进行数据分析》书中的例子:
首先,解释下题目:
在网格型数组(即二维矩阵/坐标矩阵,也就是我们上面得到的二维坐标系)上计算函数sqrt(x^2+y^2)
那么就是先根据输入的2个坐标向量(一维数组)——生成——2个坐标矩阵(二维矩阵),然后把这两个坐标矩阵当做两个浮点数那样编写表达式即可。
In [14]: import matplotlib.pyplot as plt
In [15]: import numpy as np
In [16]: points=np.arange(-5,5,0.01)
#1000个间隔0.01的点
In [17]: xs,ys=np.meshgrid(points,points)
#用1000个间隔0.01的点作为横、纵坐标,生成一个坐标系(有1000*1000个点),
#将坐标系中所有交点的横、纵坐标的集合(即2个坐标矩阵)赋值给xs,ys
In [18]: xs
Out[18]:
array([[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
...,
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99]])
In [19]: ys
Out[19]:
array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],
[-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
[-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
...,
[ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],
[ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],
[ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])
In [21]: z=np.sqrt(xs ** 2 + ys ** 2)#计算函数sqrt(x^2+y^2)
In [22]: z
Out[22]:
array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,
7.06400028],
[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
7.05692568],
[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
7.04985815],
...,
[7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,
7.04279774],
[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
7.04985815],
[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
7.05692568]])
In [23]: plt.imshow(z, cmap=plt.cm.gray);plt.colorbar()
Out[23]: <matplotlib.colorbar.Colorbar at 0xc46b790>
In [24]: plt.imshow(z, cmap=plt.cm.cool);plt.colorbar()
Out[24]: <matplotlib.colorbar.Colorbar at 0xc3f1f30>
这是二维图,展示了z的分布
绘制3维图
In [37]: zs = np.sin(z)
In [46]: fig = plt.figure()
In [47]: ax = Axes3D(fig)
In [48]: ax.scatter(xs, ys, zs)
Out[48]: <mpl_toolkits.mplot3d.art3d.Path3DCollection at 0xcb3ca90>
In [49]: ax.set_xlabel('x', fontdict={'size': 10, 'color': 'red'})
Out[49]: Text(-0.032787558578831956, -0.08518457597201665, 'x')
In [50]: ax.set_ylabel('y', fontdict={'size': 10, 'color': 'green'})
Out[50]: Text(0.05563329694431044, -0.07169324642766257, 'y')
In [51]: ax.set_zlabel('z', fontdict={'size': 10, 'color': 'blue'})
Out[51]: Text(0.08636615974838432, 0.011570871378978368, 'z')
In [52]: plt.show()
上图本来应该是散点图,(-5, 5, 0.01)1000*1000个点,应该是点太多了,所以看不清,
下图是(-5, 5, 0.1)组成的例子,100*100个点,已经有些糊了
下图是(-5, 5, 0.25)组成的例子,像个四角翘起的帽子(顶上中间凹进去了)
下图是(-5, 5, 0.2)组成的例子
这是np.arange(-10, 10, 0.25)的图
部分转自:https://blog.csdn.net/lllxxq141592654/article/details/81532855