【Python】Numpy生成坐标网格
创始人
2024-04-08 13:19:51

文章目录

    • meshgrid
    • mgrid和ogrid
    • indices

meshgrid

在三维图的绘制过程中,一般需要x,y,zx,y,zx,y,z之间的对应关系,但对于图像而言,其x,yx,yx,y轴坐标是体现在像素栅格中的,从而图像矩阵中的像素强度,其实表示的是zzz轴的坐标,这种情况下如果想绘制三维散点图,就需要生成图像像素对应的坐标网格。

Numpy中,最常用的坐标网格生成函数,就是meshgrid,其用法可参考下面的示例

x = [0,1,2,3,4]
y = [0,1,2,3]
xv, yv = np.meshgrid(x, y)
print(xv)
'''
[[0 1 2 3 4][0 1 2 3 4][0 1 2 3 4][0 1 2 3 4]]
'''
print(yv)
'''
[[0 0 0 0 0][1 1 1 1 1][2 2 2 2 2][3 3 3 3 3]]
'''

直观地说,就是对输入的x,yx,yx,y变量,分别向yyy轴和xxx轴方向进行了扩张。

mgrid和ogrid

mgrid是比meshgrid更加简单的一种数据结构,其特点是直接通过魔法函数实现了坐标网格的生成。

>>> xv, yv = np.mgrid[0:2, 2:5]
>>> print(xv)
[[0 0 0][1 1 1]]
>>> print(yv)
[[2 3 4][2 3 4]]

当然,这个维度可以是任意的,而且步长也可以是任意的,

>>> np.mgrid[1:5]
array([1, 2, 3, 4])
>>> np.mgrid[1:10:5]
array([1, 6])
>>> np.mgrid[1.1:10]
array([1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1])

如果翻阅源码,会发现mgridMGridClass()的一个实例,MGridClass则是nd_grid的一个子类,在nd_grid中,实现了__getitem__这个魔法函数,从而达成了[]的索引方法。

ogrid的用法与mgrid相同,二者都是nd_grid的子类,但生成的数组不同,直接看案例

>>>ogrid[0:5,0:5]
[array([[0],[1],[2],[3],[4]]), array([[0, 1, 2, 3, 4]])]

indices

如果想干脆一点,只是生成从0开始的等间隔的坐标网格,那么这里最推荐的是indices,这个函数只需输入维度,就可以完成网格的创建。

接下来打开一张图片演示一下

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
img = plt.imread('test.jpg')
ax = plt.subplot(projection='3d')
gray = img[:,:,1]
yMat, xMat = np.indices(gray.shape)
ax.plot_surface(xMat, yMat, gray)
ax.axis('off')
plt.show()

效果为
在这里插入图片描述
最后总结一下indices, meshgird, mgrid的等价形式

indicesindices([M,N])
meshgridmeshgrid(np.arange(M), np.arange(N))
mgridmgrid[:M,:N]

相关内容

热门资讯

最新或2023(历届)《关于对... 天津市公安局日前发布《关于对举报暴力恐怖犯罪线索实施奖励的通告》,鼓励广大人民群众举报各种涉恐可疑情...
公司关于9月3日放假通知范文 ...  9.3抗战胜利纪念日放假通知范文  最新或2023(历届)是中国人民抗日战争暨世界反法西斯战争胜利...
幼儿园中秋节活动方案 二篇 中... 【篇一】  活动目标:  1、通过活动,让幼儿初步了解中秋节的来历,知道中秋节是我国传统的团圆节。 ...
关于最新或2023(历届)中秋... 关于最新或2023(历届)中秋节福利发放通知  在中秋节即将来临之际,为了使公司全体员工欢度佳日,公...
关于做好最新或2023(历届)... 关于做好最新或2023(历届)教师节表彰工作的通知  各中小学、幼儿园,局直属单位:  为庆祝第31...