基本思想
给定可能的x值xs(可以把它们看作是图形x轴上的标记)和可能的y值ys, meshgrid生成相应的(x, y)网格点集——类似于set((x, y) for x in xs for y in yx)。例如,如果x =(1、2、3),y =(4、5、6),我们会得到一组坐标{(1,4)(2、4),(3、4),(1、5),(2、5),(3、5),(6),(2,6),(6)}。
返回值的形式
但是,meshgrid返回的表示与上面的表达式有两个不同之处:
首先,meshgrid在2d数组中布局网格点:行对应不同的y值,列对应不同的x值——如list(list((x, y) for x in xs) for y in ys),这将给出以下数组:
[[(1,4), (2,4), (3,4)],
[(1,5), (2,5), (3,5)],
[(1,6), (2,6), (3,6)]]
其次,meshgrid分别返回x和y坐标(即在两个不同的numpy 2d数组中):
xcoords, ycoords = (
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]]),
array([[4, 4, 4],
[5, 5, 5],
[6, 6, 6]]))
# same thing using np.meshgrid:
xcoords, ycoords = np.meshgrid([1,2,3], [4,5,6])
# same thing without meshgrid:
xcoords = np.array([xs] * len(ys)
ycoords = np.array([ys] * len(xs)).T
注意,np。Meshgrid还可以生成更高维度的网格。给定xs ys和zs,你会得到xcods ycods zcods作为3d数组。网格还支持维度的反向排序以及结果的稀疏表示。
应用程序
为什么我们需要这种形式的输出?
在网格的每个点上应用一个函数:
一个动机是二进制操作符(+,-,*,/,**)作为元素级操作符重载numpy数组。这意味着如果我有一个函数def f(x, y): return (x - y) ** 2,它在两个标量上工作,我也可以将它应用在两个numpy数组上,以获得一个elementwise结果的数组:例如f(xcoordinates, ycoords)或f(*np。Meshgrid (xs, ys))在上面的例子中给出了以下内容:
array([[ 9, 4, 1],
[16, 9, 4],
[25, 16, 9]])
高维外积:我不确定这有多有效,但你可以这样得到高维外积:np.prod(np. prod)Meshgrid([1,2,3],[1,2],[1,2,3,4]),轴=0)。
matplotlib中的等高线图:在研究用matplotlib绘制等高线图以绘制决策边界时,我遇到了网格。为此,你用meshgrid生成一个网格,计算每个网格点的函数(如上图所示),然后将xcods, ycods和计算的f值(即zcods)传递到contourf函数中。