1. ogrid
调取方式如下
X,Y=np.ogrid[0:2,0:3]
print(X.shape)
print(X)
print(Y.shape)
print(Y)
# 输出
(2, 1)
[[0]
[1]]
(1, 3)
[[0 1 2]]
np.ogrid可以有多个切片索引,结果也对应多个。
结果产生逻辑为
- 统一维度总数,如上X与Y均变为2维;
- 令第n个结果的值按照第n个切片索引可变,其他维度均为1,如X除第一个维度外其他维度均只有1个,即X[x,y]中y只能为0。
2. mgrid
与np.ogrid类似,只是填充了其他维度,调取方式如下
X,Y=np.mgrid[0:2,0:3]
print(X.shape)
print(X)
print(Y.shape)
print(Y)
# 输出
(2, 3)
[[0 0 0]
[1 1 1]]
(2, 3)
[[0 1 2]
[0 1 2]]
np.mgrid可以有多个切片索引,结果也对应多个。
结果产生逻辑为
- 统一维度,如X和Y均变为2行3列
- 令第n个结果的值按照第n个切片索引可变,其他维度不变(第n个维度变化时数值变化,第n个维度不变其他维度变化时数值不变)
以第1个结果X为例,变化第1个维度,X[0,0]和X[1,0]值是不一样的;而固定第一个维度变化第2个维度,X[0,0]、X[0,1]和X[0,2]值都是一样的。
与ogrid相比,填充了其他维度。
3. meshgrid
首先要理解下绘图时所说的坐标点阵和内存中存储的二维数组的不同
坐标与矩阵
对于点阵A(x,y),当我们考虑一个笛卡尔坐标系时,x对应于列;而考虑矩阵(二维数组)时,x却对应于行。
如x=0对应坐标系中的第一列,矩阵的第一行。meshgrid的参数indexing对应上述两种选项,默认为坐标模式
数组模式(indexing='ij')等价于mgrid,即meshgrid在功能上包含mgrid,(sparse=True包含ogrid)
坐标模式(indexing='xy') 只转化前两个输出值为坐标形式,通常用于绘图,如在matplotlib中常用该模式。
举例:
#meshgrid函数调用,生成两个3行2列的二维数组
X1,Y1=np.meshgrid(np.arange(0,2,1),np.arange(0,3,1))
print(X1.shape)
print(X1)
#mgrid切片器调用,生成两个2行3列的二维数组
X2,Y2=np.mgrid[0:2,0:3]
print(X2.shape)
print(X2)
#等价于X2,Y2=np.meshgrid(np.arange(0,3,1),np.arange(0,2,1),indexing='ij')
#输出
(3, 2)
[[0 1]
[0 1]
[0 1]]
(2, 3)
[[0 0 0]
[1 1 1]]
则对于坐标(x,y),有
X1[y,x]=X2[x,y]
Y1[y,x]=Y2[x,y]
4. np.mgrid与np.meshgrid的不同
meshgrid是函数形式调用,mgrid是切片器形式调用
meshgrid默认采用坐标模式,mgrid只有矩阵模式,在功能上meshgrid包含mgrid和ogrid
对于二维情况,两者结果转置相等,即X1=np.transpose(X2),Y1=np.transpose(Y2)
一般使用Y,X=np.mgrid[slice(0,y,dy),slice(0,x,dy)]来快速生成'xy'模式的X和Ymeshgrid的坐标模式只支持二维情况