diff --git a/openeo_processes_dask/process_implementations/arrays.py b/openeo_processes_dask/process_implementations/arrays.py index a02de6f8..1d16ac44 100644 --- a/openeo_processes_dask/process_implementations/arrays.py +++ b/openeo_processes_dask/process_implementations/arrays.py @@ -32,6 +32,7 @@ "array_contains", "array_find", "array_labels", + "array_apply", "first", "last", "order", @@ -213,6 +214,19 @@ def array_labels(data: ArrayLike) -> ArrayLike: return np.arange(len(data)) +def array_apply(data: ArrayLike, process: Callable, context: Optional[Any] = None) -> ArrayLike: + if not context: + context = {} + positional_parameters = {"x": 0} + named_parameters = {"x": data, "context": context} + if callable(process): + process_to_apply = np.vectorize(process) + return process_to_apply(data, + positional_parameters = positional_parameters, + named_parameters = named_parameters, + ) + + def first( data: ArrayLike, ignore_nodata: Optional[bool] = True, diff --git a/tests/test_arrays.py b/tests/test_arrays.py index 1d3e0f4f..279bb4e3 100644 --- a/tests/test_arrays.py +++ b/tests/test_arrays.py @@ -10,6 +10,7 @@ from openeo_processes_dask.process_implementations.arrays import * from openeo_processes_dask.process_implementations.cubes.reduce import reduce_dimension +from openeo_processes_dask.process_implementations.math import add from openeo_processes_dask.process_implementations.exceptions import ( ArrayElementNotAvailable, TooManyDimensions, @@ -251,6 +252,17 @@ def test_array_labels(): array_labels(np.array([[1, 0, 3, 2], [5, 0, 6, 4]])) +def test_array_apply(process_registry): + _process = partial( + process_registry["add"].implementation, + y=1, + x=ParameterReference(from_parameter="x"), + ) + + output_cube = array_apply(data=np.array([1,2,3,4,5,6]), process=_process) + assert (output_cube == [2,3,4,5,6,7]).all() + + def test_first(): assert first(np.array([1, 0, 3, 2])) == 1 assert pd.isnull(first(np.array([np.nan, 2, 3]), ignore_nodata=False))