Python中的meshgrid的目的是什么?

有人可以向我解释在Numpy中meshgrid的用途是什么?

我知道它为绘图创build了某种坐标网格,但我不能真正看到它的直接好处。

我正在学习“Python机器学习”(来自Sebastian Raschka),他正在使用它来绘制决策边界 – 请参见input法11。


编辑

我也从官方文档中试过这个代码,但是输出结果对我来说并不合适。

 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) 

编辑2

请尽可能展示更真实的示例,因为@Suever已经很好地解释了这个function。

meshgrid的目的是从x值数组和y值数组中创build一个矩形网格。

因此,例如,如果我们想要创build一个网格,我们在x和y方向上都有一个0到4之间的整数值。 要创build一个矩形网格,我们需要每个xy点的组合。

这将是25点,对吧? 所以如果我们想为所有这些点创build一个x和y数组,我们可以做到以下几点。

 x[0,0] = 0 y[0,0] = 0 x[0,1] = 0 y[0,1] = 1 x[0,2] = 0 y[0,2] = 2 x[0,3] = 0 y[0,3] = 3 x[0,4] = 0 y[0,4] = 4 x[1,0] = 1 y[1,0] = 0 x[1,1] = 1 y[1,1] = 1 ... x[4,3] = 4 y[4,3] = 3 x[4,4] = 4 y[4,4] = 4 

这将导致下面的xymatrix,使得每个matrix中相应元素的配对给出网格中点的x和y坐标。

 x = 0 0 0 0 0 y = 0 1 2 3 4 1 1 1 1 1 0 1 2 3 4 2 2 2 2 2 0 1 2 3 4 3 3 3 3 3 0 1 2 3 4 4 4 4 4 4 0 1 2 3 4 

然后我们可以绘制这些图来validation它们是一个网格:

 plt.plot(x,y, marker='.', color='k', linestyle='none') 

在这里输入图像说明

显然,这是非常繁琐的,尤其是对于大范围的xy 。 相反, meshgrid实际上可以为我们生成这个:所有我们必须指定的是唯一的xy值。

 xvalues = np.array([0, 1, 2, 3, 4]); yvalues = np.array([0, 1, 2, 3, 4]); 

现在,当我们调用meshgrid ,我们会自动获得前一个输出。

 xx, yy = np.meshgrid(xvalues, yvalues) plt.plot(xx, yy, marker='.', color='k', linestyle='none') 

在这里输入图像说明

这些矩形网格的创build对于一些任务是有用的。 在你在文章中提供的例子中,它只是一个简单的方法来在一个范围内对一个函数( sin(x**2 + y**2) / (x**2 + y**2) )进行采样xy值。

由于此function是在矩形网格上采样的,现在该function可以被视为一个“图像”。

在这里输入图像说明

此外,结果现在可以传递给期望矩形网格上的数据的函数(即contourf

致谢微软凯越:

在这里输入图像说明

假设你有一个function:

 def sinus2d(x, y): return np.sin(x) + np.sin(y) 

例如,你想要看看它在0到2 * pi的范围内看起来像什么。 你会怎么做? 有np.meshgrid进来:

 xx, yy = np.meshgrid(np.linspace(0,2*np.pi,100), np.linspace(0,2*np.pi,100)) z = sinus2d(xx, yy) # Create the image on this grid 

这样的情节看起来像:

 import matplotlib.pyplot as plt plt.imshow(z, origin='lower', interpolation='none') plt.show() 

在这里输入图像说明

所以np.meshgrid只是一个方便。 原则上也可以这样做:

 z2 = sinus2d(np.linspace(0,2*np.pi,100)[:,None], np.linspace(0,2*np.pi,100)[None,:]) 

但在那里你需要知道你的维度(假设你有两个以上的…)和正确的广播。 np.meshgrid为你做这一切。

另外,如果您想要进行插值但排除某些值,则meshgrid允许您将数据与数据一起删除:

 condition = z>0.6 z_new = z[condition] # This will make your array 1D 

那么你现在怎么做插值? 你可以给xy插入函数,比如scipy.interpolate.interp2d所以你需要知道哪些坐标被删除的方法:

 x_new = xx[condition] y_new = yy[condition] 

然后你仍然可以插入“正确的”坐标(没有meshgrid的情况下试一下,你会得到很多额外的代码):

 from scipy.interpolate import interp2d interpolated = interp2(x_new, y_new, z_new) 

并且原始的meshgrid允许您再次获取原始网格上的插值:

 interpolated_grid = interpolated(xx, yy) 

这些只是我使用meshgrid一些例子,可能还有很多。