Source code for ewoksfluo.tasks.regrid_data.mesh_utils
from typing import Sequence, Tuple, List
import numpy
from scipy.interpolate import griddata
[docs]
def scan_mesh_coordinates(positions: Sequence[numpy.ndarray]) -> List[numpy.ndarray]:
"""Regular grid positions encapsulating a non-regular grid.
:param positions: `shape = (nD, n0, n1, ...)` irregular grid positions
:returns: nD arrays of sizes `n0`, `n1`, ...
"""
return [
numpy.linspace(coord.min(), coord.max(), n)
for coord, n in zip(positions, positions[0].shape)
]
[docs]
def scan_meshgrid_coordinates(
positions: Sequence[numpy.ndarray],
) -> Tuple[numpy.ndarray]:
"""Expand regular grid positions.
:param positions: nD arrays of sizes `n0`, `n1`, ...
:returns: `shape = (nD, n0, n1, ...)`
"""
return tuple(numpy.meshgrid(*positions, indexing="ij"))
[docs]
def interpolate(
scatter_coordinates: Tuple[numpy.ndarray],
meshgrid_coordinates: Tuple[numpy.ndarray],
data: numpy.ndarray,
method="linear",
fill_value=numpy.nan,
) -> numpy.ndarray:
"""Interpolate C-order flattened data.
:param scatter_coordinates: `shape = (nD, nPoints)` with `nPoints = n0*n1*...`
:param meshgrid_coordinates: `shape = (nD, n0, n1, ...)`
:param data: `shape = (nPoints,)`
:param method: interpolate method
:param fill_value: value outside interpolation range
:returns: `shape = (n0, n1, ...)`
"""
return griddata(
scatter_coordinates,
data,
meshgrid_coordinates,
method=method,
fill_value=fill_value,
)