np.meshgrid
的作用是什么?我知道它会为绘图创建某种坐标网格,但我看不到它的直接好处。
官方文档给出了下面的例子,但它的输出对我来说没有意义:
x = np.arange(-5, 5, 1)
y = np.arange(-5, 5, 1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
h = plt.contourf(x,y,z)
np.meshgrid
的作用是什么?我知道它会为绘图创建某种坐标网格,但我看不到它的直接好处。
官方文档给出了下面的例子,但它的输出对我来说没有意义:
x = np.arange(-5, 5, 1)
y = np.arange(-5, 5, 1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
h = plt.contourf(x,y,z)
9条答案
按热度按时间7vux5j2d1#
meshgrid
的目的是用x值数组和y值数组创建一个矩形网格。因此,例如,如果我们想要创建一个网格,其中在x和y方向上的每个0到4之间的整数值处都有一个点。要创建一个矩形网格,我们需要
x
和y
点的每个组合。这将是25分,对吧?因此,如果我们想为所有这些点创建一个x和y数组,我们可以做以下事情。
这将导致以下
x
和y
矩阵,使得每个矩阵中对应元素的配对给出网格中点的x和y坐标。然后我们可以绘制这些图来验证它们是否是网格:
显然,这变得非常乏味,特别是对于大范围的
x
和y
。相反,meshgrid
实际上可以为我们生成以下内容:所有我们必须指定的是唯一的x
和y
值。现在,当我们调用
meshgrid
时,我们会自动获得之前的输出。创建这些矩形网格对于许多任务都很有用。在你在文章中提供的例子中,它只是一种在
x
和y
的值范围内对函数(sin(x**2 + y**2) / (x**2 + y**2)
)进行采样的方法。因为这个函数是在矩形网格上采样的,所以这个函数现在可以被可视化为一个“图像”。
此外,结果现在可以传递给期望矩形网格上的数据的函数(即,
contourf
)ca1c2owp2#
使用Microsoft Excel:
atmip9wb3#
实际上,
np.meshgrid
的用途已经在文档中提到:np.meshgrid
从坐标向量返回坐标矩阵。
在给定一维坐标阵列x1,x2,...,xn的情况下,制作N-D坐标阵列,用于N-D网格上的N-D标量/向量场的向量化计算。
所以它的主要目的是创建一个坐标矩阵。
你可能会问自己:
为什么需要创建坐标矩阵?
Python/NumPy需要坐标矩阵的原因是坐标与值之间没有直接关系,除非坐标从零开始并且是纯正整数。然后你可以只使用数组的索引作为索引。然而,当情况并非如此时,您需要以某种方式将坐标与数据一起存储。这就是网格的用武之地。
假设你的数据是:
但是,每个值代表一个3 x 2公里的区域(水平x垂直)。假设你的原点是左上角,你想用数组来表示距离,你可以用途:
其中V是:
和h:
所以如果你有两个索引,比如
x
和y
(这就是为什么meshgrid
的返回值通常是xx
或xs
而不是x
的原因,在这个例子中,我选择了h
来表示水平!)然后你可以得到点的x坐标,点的y坐标和该点的值,通过使用:这使得跟踪坐标和变得更加容易(更重要的是),您可以将它们传递给需要知道坐标的函数。
稍微长一点的解释
然而,
np.meshgrid
本身并不经常被直接使用,大多数情况下,人们只是使用np.mgrid
或np.ogrid
中的一个 * 类似 * 对象。这里np.mgrid
代表sparse=False
,np.ogrid
代表sparse=True
(我指的是np.meshgrid
的sparse
参数)。请注意,np.meshgrid
与np.ogrid
和np.mgrid
之间存在显著差异:前两个返回值(如果有两个或更多)将被反转。通常这并不重要,但你应该根据上下文给给予有意义的变量名。例如,在2D网格和
matplotlib.pyplot.imshow
的情况下,将第一个返回项命名为np.meshgrid
x
和第二个返回项命名为y
是有意义的,而对于np.mgrid
和np.ogrid
则相反。np.ogrid
和稀疏网格如前所述,与
np.meshgrid
相比,输出是相反的,这就是为什么我将其解包为yy, xx
而不是xx, yy
:这看起来已经像坐标,特别是2D图的x和y线。
可视化:
np.mgrid
和密集/充实的网格这同样适用于这里:输出与
np.meshgrid
相反:与
ogrid
不同,这些数组包含所有xx
和yy
坐标,坐标在-5 <= xx <= 5;-5 <= yy <= 5网格。功能
它不仅限于2D,这些函数适用于任意维度(好吧,Python中函数的参数数量有最大值,NumPy允许的维度数量也有最大值):
即使这些也适用于1D,也有两个(更常见的)1D网格创建函数:
np.arange
np.linspace
除了
start
和stop
参数外,它还支持step
参数(即使是表示步骤数的复杂步骤):应用
你特别问了它的用途,事实上,如果你需要一个坐标系,这些网格非常有用。
例如,如果你有一个NumPy函数,它可以计算两个维度的距离:
你想知道每个点的距离:
如果在密集网格而不是开放网格中传递,输出将是相同的。NumPys广播使之成为可能!
让我们可视化结果:
这也是NumPys
mgrid
和ogrid
变得非常方便的时候,因为它允许您轻松更改网格的分辨率:但是,由于
imshow
不支持x
和y
输入,因此必须手动更改刻度。如果它能接受x
和y
坐标,那就太方便了,对吧?使用NumPy编写自然处理网格的函数很容易。此外,NumPy、SciPy、matplotlib中有几个函数希望你传入网格。
我喜欢图像,所以让我们探索
matplotlib.pyplot.contour
:请注意,坐标已经正确设置!如果你只是传入
density
,情况就不会是这样了。或者给予另一个有趣的例子,使用astropy models(这次我不太关心坐标,我只是用它们来创建 * 一些 * 网格):
虽然这只是“为了外观”,但Scipy中与功能模型和拟合相关的几个函数(例如
scipy.interpolate.interp2d
,scipy.interpolate.griddata
甚至显示了使用np.mgrid
的示例)等。需要网格。大多数这些工作与开放的网格和密集的网格,但有些只与其中之一。zyfwsgd64#
假设你有一个函数:
比如,你想看看它在0到2* π的范围内是什么样子的。你会怎么做?
np.meshgrid
进来了:这样的图看起来像这样:
所以
np.meshgrid
只是一种方便。原则上,可以通过以下方式实现同样的目标:但是在那里你需要意识到你的维度(假设你有两个以上的维度...)和正确的广播。
np.meshgrid
为您做了所有这些。此外,meshgrid允许您删除坐标和数据,例如,如果您想要进行插值但排除某些值:
那么你现在怎么做插值呢你可以给予
x
和y
插值函数,比如scipy.interpolate.interp2d
,所以你需要一种方法来知道哪些坐标被删除了:然后你仍然可以使用“正确”的坐标进行插值(尝试不使用meshgrid,你会有很多额外的代码):
原始的meshgrid允许你再次在原始网格上得到插值:
这些只是我使用
meshgrid
的一些例子,可能还有更多。iklwldmw5#
简短回答
meshgrid
的目的是通过NumPy库中提供的更快的矢量化操作来帮助replace slow Python loops。meshgrid
的作用是准备向量化操作所需的2D数组。基本原理示例
假设我们有两个值序列,
我们想对每一对可能的值执行一个操作,一个取自第一个列表,一个取自第二个列表。我们还想存储结果。例如,假设我们想要获得每个可能对的值的总和。
测试结果:
测试结果:
从这个基本的例子中,你可以看到显式的慢Python循环是如何被Numpy库中隐藏的更快的C循环所取代的。这一原理广泛用于3D操作,包括彩色像素图。常见的例子是3D绘图。
常用用途:3D绘图
(取自本网站)
meshgrid
用于创建在-4和+4之间的坐标对,在X和Y方向上每个增量为0.25。每一对都用来从中找到R和Z。这种准备坐标“网格”的方法经常用于绘制3D表面或着色2D表面。引擎盖下的网格
由
meshgrid
准备的两个阵列是:这些数组是通过水平或垂直重复提供的值创建的。这两个数组对于向量运算是形状兼容的。
来源
numpy.meshgrid
是from MATLAB,就像许多其他NumPy函数一样。因此,您也可以研究MATLAB中的示例,以了解meshgrid
的使用情况,3D绘图的代码看起来像the same in MATLAB。1hdlvixo6#
meshgrid有助于从两个一维数组中创建一个矩形网格,其中包含两个数组中的所有点对。
现在,如果你已经定义了一个函数f(x,y),你想把这个函数应用到数组'x'和'y'中所有可能的点的组合,那么你可以这样做:
比如说,如果你的函数只产生两个元素的乘积,那么这就是如何实现一个carnival乘积,对于大型数组来说是有效的。
引用自here
lmvvr0a87#
基本思路
给定可能的x值
xs
(将它们视为图的x轴上的刻度线)和可能的y值,ys
,meshgrid
生成相应的(x,y)网格点集-类似于set((x, y) for x in xs for y in yx)
。例如,如果xs=[1,2,3]
和ys=[4,5,6]
,我们将得到坐标{(1,4), (2,4), (3,4), (1,5), (2,5), (3,5), (1,6), (2,6), (3,6)}
。返回值形式
但是,
meshgrid
返回的表示与上面的表达式有两个不同之处:meshgrid
在2d数组中布局网格点:行对应于不同的y值,列对应于不同的x值-如list(list((x, y) for x in xs) for y in ys)
,这将给予以下数组:meshgrid
分别返回x和y坐标(即在两个不同的numpy 2d数组中):注意,
np.meshgrid
也可以生成更高维度的网格。给定xs,ys和zs,你会得到xcoords,ycoords,zcoords作为3d数组。meshgrid
还支持维度的逆序以及结果的稀疏表示。应用
为什么我们需要这种形式的输出?
def f(x, y): return (x - y) ** 2
,它适用于两个标量,我也可以将它应用于两个numpy数组,以获得一个元素级结果的数组:例如,f(xcoords, ycoords)
或f(*np.meshgrid(xs, ys))
给出了上面示例的以下内容:np.prod(np.meshgrid([1,2,3], [1,2], [1,2,3,4]), axis=0)
。meshgrid
。为此,您使用meshgrid
生成网格,在每个网格点处评估函数(例如,如上所示),然后传递xcoords、ycoords和计算的f值(即,zcoords)到contourf函数中。4ngedf3f8#
幕后:
让我们以@Sarsaparilla的answer数据集为例:
并且其输出:
ztigrdn89#
要在NumPy中构造数组的直积,我们可以使用meshgrid函数。它创建二维数组,其中包含两个原始数组中元素的所有可能组合。
然后我们得到: