Find entries of all hypercubes. If `centers=None`, then use `self.centers_` as computed in `self.fit`.
            
            Empty hypercubes are removed from the result

        Parameters
        ===========

        data: array-like
            Data to find in entries in cube. Warning: first column must be index column.
        centers: list of array-like
            Center points for all cubes as returned by `self.fit`. Default is to use `self.centers_`.

        Returns
        =========
        hypercubes: list of array-like
            list of entries in each hypercobe in `data`.

def transform(self, data, centers=None):
        """ Find entries of all hypercubes. If `centers=None`, then use `self.centers_` as computed in `self.fit`.
            
            Empty hypercubes are removed from the result

        Parameters
        ===========

        data: array-like
            Data to find in entries in cube. Warning: first column must be index column.
        centers: list of array-like
            Center points for all cubes as returned by `self.fit`. Default is to use `self.centers_`.

        Returns
        =========
        hypercubes: list of array-like
            list of entries in each hypercobe in `data`.

        """

        centers = centers or self.centers_
        hypercubes = [
            self.transform_single(data, cube, i) for i, cube in enumerate(centers)
        ]

        # Clean out any empty cubes (common in high dimensions)
        hypercubes = [cube for cube in hypercubes if len(cube)]
        return hypercubes