def _read_binary(self):
        """Reads data and metadata from binary format."""
        # NOTE: binary files store binned data using Fortran-like ordering.
        # Dimensions are iterated like z, y, x (so x changes fastest)

        header_path = self.path + 'header'
        with open(header_path) as f_header:
            self._read_header(f_header.read())

        data = np.fromfile(self.path)

        # separate data by statistic
        data = data.reshape((len(self.statistics), -1), order='F')
        data = {stat: data[i] for i, stat in enumerate(self.statistics)}

        # reshape data according to binning
        data_shape = [dim.n_bins for dim in self.dimensions]
        data = {k: v.reshape(data_shape, order='F') for k, v in data.items()}

        self.data = data