What is the purpose of meshgrid in Python / NumPy?

前端 未结 7 1911
渐次进展
渐次进展 2020-12-04 04:03

Can someone explain to me what is the purpose of meshgrid function in Numpy? I know it creates some kind of grid of coordinates for plotting, but I can\'t reall

相关标签:
7条回答
  • 2020-12-04 05:03

    Basic Idea

    Given possible x values, xs, (think of them as the tick-marks on the x-axis of a plot) and possible y values, ys, meshgrid generates the corresponding set of (x, y) grid points---analogous to set((x, y) for x in xs for y in yx). For example, if xs=[1,2,3] and ys=[4,5,6], we'd get the set of coordinates {(1,4), (2,4), (3,4), (1,5), (2,5), (3,5), (1,6), (2,6), (3,6)}.

    Form of the Return Value

    However, the representation that meshgrid returns is different from the above expression in two ways:

    First, meshgrid lays out the grid points in a 2d array: rows correspond to different y-values, columns correspond to different x-values---as in list(list((x, y) for x in xs) for y in ys), which would give the following array:

       [[(1,4), (2,4), (3,4)],
        [(1,5), (2,5), (3,5)],
        [(1,6), (2,6), (3,6)]]
    

    Second, meshgrid returns the x and y coordinates separately (i.e. in two different numpy 2d arrays):

       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
    

    Note, np.meshgrid can also generate grids for higher dimensions. Given xs, ys, and zs, you'd get back xcoords, ycoords, zcoords as 3d arrays. meshgrid also supports reverse ordering of the dimensions as well as sparse representation of the result.

    Applications

    Why would we want this form of output?

    Apply a function at every point on a grid: One motivation is that binary operators like (+, -, *, /, **) are overloaded for numpy arrays as elementwise operations. This means that if I have a function def f(x, y): return (x - y) ** 2 that works on two scalars, I can also apply it on two numpy arrays to get an array of elementwise results: e.g. f(xcoords, ycoords) or f(*np.meshgrid(xs, ys)) gives the following on the above example:

    array([[ 9,  4,  1],
           [16,  9,  4],
           [25, 16,  9]])
    

    Higher dimensional outer product: I'm not sure how efficient this is, but you can get high-dimensional outer products this way: np.prod(np.meshgrid([1,2,3], [1,2], [1,2,3,4]), axis=0).

    Contour plots in matplotlib: I came across meshgrid when investigating drawing contour plots with matplotlib for plotting decision boundaries. For this, you generate a grid with meshgrid, evaluate the function at each grid point (e.g. as shown above), and then pass the xcoords, ycoords, and computed f-values (i.e. zcoords) into the contourf function.

    0 讨论(0)
提交回复
热议问题