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一个矩形网格,我们需要每个x
和y
点的组合。
这将是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
这将导致下面的x
和y
matrix,使得每个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')
显然,这是非常繁琐的,尤其是对于大范围的x
和y
。 相反, meshgrid
实际上可以为我们生成这个:所有我们必须指定的是唯一的x
和y
值。
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)
)进行采样x
和y
值。
由于此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
那么你现在怎么做插值? 你可以给x
和y
插入函数,比如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
一些例子,可能还有很多。