python数据分析numpy基础之meshgrid生成网格点坐标

1 python数据分析numpy基础之meshgrid生成网格点坐标

python的numpy库的meshgrid()函数用于生成网格点的坐标矩阵。

用法

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

描述

返回坐标向量中的坐标矩阵列表。

入参

  1. *xi:可选,array_like

x1,x2,…,xn,表示网格坐标的一维数组;

  1. copy:可选,bool

默认为True,表示复制原始数组的视图,False则不复制,直接返回原始数组的视图;

  1. sparse:可选,bool

默认为False,表示不返回稀疏矩阵,True表示返回稀疏矩阵;

  1. indexing:可选,{‘xy’,’ij’}

用于指定输出的网格数组的索引顺序,该参数的取值可以是’xy’或’ij’;

1.1 入参xi

numpy.meshgrid()的入参xi为必选入参,表示网格坐标的一维数组。

如果xi送2个一维数组x和y,那么一维数组x,对应网格点的横坐标向量;

一维数组y,对应网格点的纵坐标向量。

如果xs,ys=np.meshgrid(x,y),那么xs和ys就是坐标矩阵。

x一维数组的大小为C,y一维数组的大小为R,那么xs和ys坐标矩阵大小为(R,C)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上图中,假设横轴为X轴,纵轴为Y轴,那么每个红色的点可以用X轴上的坐标和Y轴上的坐标唯一确定。在X轴和Y轴垂直的情况下,X轴的坐标表示到Y轴的距离,Y轴的坐标表示到X轴的距离,

每个红色的点都是网格线交叉而成,称为网格点,网格点用网格坐标表示。

比如,上图的红色点可以通过x=1(2,3,4)的直线(网格线),与y=5(6,7,8,9)的直线交叉形成。

将这些红色网格点的X轴坐标用矩阵表示,形成5×4(5行4列)的X坐标矩阵,如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将这些红色网格点的Y轴坐标用矩阵表示,形成5×4(5行4列)的Y坐标矩阵,如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

X和Y坐标矩阵的行列值相等,因为他们由相同的网格点拆分而成。

X和Y坐标矩阵,都有5行,对应Y轴的y直线条数共5条(y=5,6,7,8,9);都有4列,对应X轴的x直线条数共4条(x=1,2,3,4)。

X和Y的坐标矩阵的坐标值,组成红色点的坐标。

比如,红色点A坐标值(1,5),由X坐标矩阵的X01(1)和Y坐标矩阵的Y01(5)组成,即A坐标为(X01, Y01),即(1,5)。

X和Y坐标矩阵可以通过numpy.meshgrid()生成。

将x直线值(1,2,3,4)组成的一维数组,和y直线值(5,6,7,8,9)组成的一维数组,送给xi调用numpy.meshgrid()函数,就可以获取X和Y坐标矩阵。

>>> import numpy as np
# xi送2个列表,返回2个二维数组组成的列表
>>> xy=np.meshgrid([1,2,3],[4,5,6])
>>> xy
[array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]]), array([[4, 4, 4],
       [5, 5, 5],
       [6, 6, 6]])]

>>> x=np.array([1,2,3])
>>> y=np.array([4,5])
>>> x.shape,y.shape
((3,), (2,))
# xi送2个一维数组,返回2个二维数组组成的列表
>>> xs,ys=np.meshgrid(x,y)
>>> print(xs)
[[1 2 3]
 [1 2 3]]
>>> print(ys)
[[4 4 4]
 [5 5 5]]
 >>> xs.shape,ys.shape
((2, 3), (2, 3))
# xi送二维(或多维)数组,返回一维数组组成的列表
>>> ar2=np.arange(12).reshape(3,4)
>>> np.meshgrid(ar2)
[array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])]

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x=np.array([1,2,3,4])
>>> y=np.array([5,6,7,8,9])
# 返回二维数组坐标矩阵xs和ys,行数为y的元素个数,列数为x的元素个数
# xs ,每行值为x一维数组
# ys ,每列值为y一维数组
>>> xs,ys=np.meshgrid(x,y)
>>> xs
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])
>>> ys
array([[5, 5, 5, 5],
       [6, 6, 6, 6],
       [7, 7, 7, 7],
       [8, 8, 8, 8],
       [9, 9, 9, 9]])
>>> plt.plot(xs,ys,
     color='red', # 网格坐标为红色
     marker='.',  # 网格坐标为圆点
     linestyle='') # 网格点之间不连线
>>> plt.grid(True) # 绘制网格
>>> plt.xticks(range(1,6,1)) # 设置X轴坐标刻度范围和间隔
>>> plt.yticks(range(5,10,1)) # 设置Y轴坐标刻度范围和间隔
>>> plt.show() # 绘制网格

1.2 入参indexing

np.meshgrid()的入参indexing为可选入参,用于指定输出的网格数组的索引顺序,该参数的取值可以是’xy’或’ij’。

‘xy’:为默认值,表示输出的网格数组使用笛卡尔坐标系进行索引。即第一个维度对应x轴,第二个维度对应y轴。

‘ij’:表示输出的网格数组使用矩阵索引进行索引。即第一个维度表示行索引,第二个维度表示列索引。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上图,indexing=’xy’时,从左到由为索引方向,

np.meshgrid()返回的第1个二维数组由X轴[1,2,3,4], [1,2,3,4], [1,2,3,4], [1,2,3,4], [1,2,3,4]组成,即网格点的第1位坐标由X轴从左到右组成;

返回的第2个二维数组由Y轴[5,5,5,5],[6,6,6,6],[7,7,7,7],[8,8,8,8],[9,9,9,9]组成,即网格点的第2位坐标由Y轴从下到上组成。

indexing=’ij’时,从下到上为索引方向,

np.meshgrid()返回的第1个二维数组由i轴组成[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],即网格点的第1位坐标由i轴从下到上组成;

第2个二维数组由j轴(从左到由)组成[5, 6, 7, 8, 9], [5, 6, 7, 8, 9], [5, 6, 7, 8, 9], [5, 6, 7, 8, 9] ,即网格点的第2位坐标由j轴从左到右组成。

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x=np.array([1,2,3,4])
>>> y=np.array([5,6,7,8,9])
# 输入长度为M和N的两个一维数组时
# xy返回形状为(N,M)的二维数组
# xs ,每行值为x一维数组 ,ys ,每列值为y一维数组
>>> xv,yv=np.meshgrid(x,y,indexing='xy')
# ij返回形状为(M,N)的二维数组
# iv ,每列值为x一维数组 ,jv ,每行值为y一维数组
>>> iv,jv=np.meshgrid(x,y,indexing='ij')
>>> xv.shape,yv.shape
((5, 4), (5, 4))
>>> iv.shape,jv.shape
((4, 5), (4, 5))
>>> xv
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])
>>> yv
array([[5, 5, 5, 5],
       [6, 6, 6, 6],
       [7, 7, 7, 7],
       [8, 8, 8, 8],
       [9, 9, 9, 9]])
>>> iv
array([[1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4]])
>>> jv
array([[5, 6, 7, 8, 9],
       [5, 6, 7, 8, 9],
       [5, 6, 7, 8, 9],
       [5, 6, 7, 8, 9]])
  • 44
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值