【Python】Numpy生成坐标网格

本文介绍了Numpy中用于生成坐标网格的函数,包括meshgrid、mgrid和ogrid。meshgrid适用于创建三维图的坐标对应关系,mgrid简化了坐标网格的生成,而ogrid则提供了另一种不同的输出形式。此外,还提到了indices函数,用于快速创建等间隔坐标网格。示例代码展示了这些函数的具体用法,并在最后总结了它们之间的等价形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Numpy基础:数学计算🔥 逻辑运算

meshgrid

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

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]]
'''

即xv为

[ 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 ] \begin{bmatrix} 0&1&2&3&4\\ 0&1&2&3&4\\ 0&1&2&3&4\\ 0&1&2&3&4\\ \end{bmatrix} 00001111222233334444

而yv为

[ 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 ] \begin{bmatrix} 0&0&0&0&0\\ 1&1&1&1&1\\ 2&2&2&2&2\\ 3&3&3&3&3\\ \end{bmatrix} 01230123012301230123

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

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值