def transform(self, X):
        r"""Apply transform to each feature.

        Parameters
        ----------
        X : array-like, shape = (n_samples, n_features, n_timestamps)
            Multivariate time series.

        Returns
        -------
        X_new : array, shape = (n_samples, *) or (n_samples, n_features, *)
            Transformed time series.

        """
        X = check_3d_array(X)
        n_samples, _, _ = X.shape
        check_is_fitted(self, 'estimators_')

        X_transformed = [transformer.transform(X[:, i, :])
                         for i, transformer in enumerate(self.estimators_)]
        all_sparse = np.all([isinstance(X_transformed_i, csr_matrix)
                             for X_transformed_i in X_transformed])
        if all_sparse:
            X_new = hstack(X_transformed)
        else:
            X_new = [self._convert_to_array(X_transformed_i)
                     for X_transformed_i in X_transformed]
            ndims = [X_new_i.ndim for X_new_i in X_new]
            shapes = [X_new_i.shape for X_new_i in X_new]
            one_dim = (np.unique(ndims).size == 1)
            if one_dim:
                one_shape = np.unique(shapes, axis=0).shape[0] == 1
            else:
                one_shape = False
            if (not one_shape) or self.flatten:
                X_new = [X_new_i.reshape(n_samples, -1) for X_new_i in X_new]
                X_new = np.concatenate(X_new, axis=1)
            else:
                X_new = np.asarray(X_new)
                axes = [1, 0] + [i for i in range(2, X_new.ndim)]
                X_new = np.transpose(X_new, axes=axes)
        return X_new
Apply transform to each feature.

        Parameters
        ----------
        X : array-like, shape = (n_samples, n_features, n_timestamps)
            Multivariate time series.

        Returns
        -------
        X_new : array, shape = (n_samples, *) or (n_samples, n_features, *)
            Transformed time series.

        
pyts/multivariate/transformation/multivariate.py