Source code for gtda.mapper.utils.pipeline

"""Utility functions for scikit-learn pipelines."""
# License: GNU AGPLv3

from functools import partial
from inspect import signature

import numpy as np
from sklearn.preprocessing import FunctionTransformer


def _make_func_apply_along_axis_1(func):
    return partial(np.apply_along_axis, func, 1)


def _reshape_after_apply(func, arr):
    res = func(arr)
    if res.ndim == 1:
        res = res[:, None]
    return res


[docs]def transformer_from_callable_on_rows(func, validate=True): """Construct a transformer from a callable acting on 1D arrays. Given a callable which can act on 1D arrays, this function returns a fit-transformer which applies the callable to slices of 2D arrays along axis 1. When possible, the array output by the transformer's :meth:`fit_transform` is two-dimensional. Parameters ---------- func : callable or None A callable object, or ``None`` which returns the identity transformer. validate : bool, optional, default: ``True`` Whether the output transformer should implement input validation. Returns ------- function_transformer : :class:`sklearn.preprocessing.FunctionTransformer` \ object Output fit-transformer. Examples -------- >>> import numpy as np >>> from gtda.mapper import transformer_from_callable_on_rows >>> function_transformer = transformer_from_callable_on_rows(np.sum) >>> X = np.array([[0, 1], [2, 3]]) >>> print(function_transformer.fit_transform(X)) [[1], [5]] """ if func is not None: func_params = signature(func).parameters if 'axis' in func_params: # Use native (faster) numpy implementation func_along_axis = partial(func, axis=1, keepdims=True) else: func_along_axis = partial(_reshape_after_apply, _make_func_apply_along_axis_1(func)) else: func_along_axis = None return FunctionTransformer(func=func_along_axis, validate=validate)
def identity(validate=False): return FunctionTransformer(validate=validate)