What is the purpose of np.meshgrid in NumPy?

I’m trying to understand the purpose of np.meshgrid. I know it creates a grid of coordinates for plotting, but I’m not sure about its direct benefit. For example:

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)

The output is confusing to me. Can someone explain how np.meshgrid works and why it’s useful?

I’ve struggled with np.meshgrid the first few times too :sweat_smile:. Think of it like this:

np.meshgrid takes 1D arrays for x and y coordinates and turns them into 2D coordinate grids.

This is super useful when you want to evaluate a function over a grid of points, like in plotting surfaces or contours.

Example:

import numpy as np
x = np.arange(-2, 3, 1)
y = np.arange(-2, 3, 1)
xx, yy = np.meshgrid(x, y)

print(xx)
# Rows repeat x values: [[-2 -1 0 1 2], [-2 -1 0 1 2], ...]
print(yy)
# Columns repeat y values: [[-2 -2 -2 -2 -2], [-1 -1 -1 -1 -1], ...]

Now, you can compute something like z = xx**2 + yy**2 for every combination of x and y in one go.

I usually use np.meshgrid whenever I need to evaluate a function on a 2D plane. For example, contour plots or 3D surface plots:

z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
plt.contourf(xx, yy, z)
plt.show()

Without meshgrid, you’d have to loop over every x and y combination, messy and slow.

With meshgrid, operations are vectorized, so NumPy can calculate all z-values at once efficiently.

I noticed you used sparse=True. That’s a cool feature I often use for memory efficiency:

xx, yy = np.meshgrid(x, y, sparse=True)

xx has only columns repeated, yy has only rows repeated.

When you do operations like z = xx**2 + yy**2, NumPy broadcasts automatically.

Saves memory when your grid is huge.

I use this trick when plotting large surfaces or evaluating physics simulations over a large domain, it keeps things fast and lightweight.