Source code for torx.analysis.contour_finding_m

"""Implementation of a contour finding routine for 2D data."""
import numpy as np
from skimage import measure

from torx.decorators import autodoc_function

[docs] @autodoc_function def find_contours( x_vals: np.array, y_vals: np.array, array: np.ndarray, level: float ) -> list: """ Find the contours of an array at a given level. skimage uses pixel units, so we need to convert back to real units. """ x_vals, y_vals, array = np.asarray(x_vals), np.asarray(y_vals), np.asarray(array) assert x_vals.size == array.shape[-1] assert y_vals.size == array.shape[-2] x_spacing, y_spacing = np.mean(np.diff(x_vals)), np.mean(np.diff(y_vals)) assert np.allclose(np.diff(x_vals), x_spacing) and np.allclose( np.diff(y_vals), y_spacing ), "Error: basis vectors are not equally spaced." contours = measure.find_contours(array, level) # Contours is a list of numpy arrays, where the numpy arrays have the # shape (n, 2) for i, contour in enumerate(contours): # For each contour level found, switch the x and y elements, and then # convert to grid units x_contour, y_contour = contour[:, 1], contour[:, 0] x_contour, y_contour = ( x_contour * x_spacing + x_vals.min(), y_contour * y_spacing + y_vals.min(), ) contours[i] = np.column_stack((x_contour, y_contour)) return contours