I have a numpy array that contains some image data. I would like to plot the ‘profile’ of a transect drawn across the image. The simplest case is a profile running parallel to the edge of the image, so if the image array is imdat, then the profile at a selected point (r,c) is simply imdat[r] (horizontal) or imdat[:,c] (vertical).
Now, I want to take as input two points (r1,c1) and (r2,c2), both lying inside imdat. I would like to plot the profile of the values along the line connecting these two points.
What is the best way to get values from a numpy array, along such a line? More generally, along a path/polygon?
I have used slicing and indexing before, but I can’t seem to arrive at an elegant solution for such a where consecutive slice elements are not in the same row or column. Thanks for your help.
@Sven’s answer is the easy way, but it’s rather inefficient for large arrays. If you’re dealing with a relatively small array, you won’t notice the difference, if you’re wanting a profile from a large (e.g. >50 MB) you may want to try a couple of other approaches. You’ll need to work in “pixel” coordinates for these, though, so there’s an extra layer of complexity.
There are two more memory-efficient ways. 1) use
scipy.ndimage.map_coordinatesif you need bilinear or cubic interpolation. 2) if you just want nearest neighbor sampling, then just use indexing directly.As an example of the first:
The equivalent using nearest-neighbor interpolation would look something like this:
However, if you’re using nearest-neighbor, you probably would only want samples at each pixel, so you’d probably do something more like this, instead…