def convert_many(self, coords, molecule=None, origins=None, axes=None, ordering=None, strip_embedding=True, strip_dummies=False, **kwargs):
    '\n        Converts from Cartesian to ZMatrix coords, preserving the embedding\n\n        :param coords: coordinates in Cartesians to convert\n        :type coords: np.ndarray\n        :param molecule:\n        :type molecule: AbstractMolecule\n        :param origins: the origin for each individual structure\n        :type origins: np.ndarray\n        :param axes: the axes for each structure\n        :type axes: np.ndarray\n        :param ordering: the Z-matrix ordering spec\n        :type ordering:\n        :param strip_embedding: whether to strip the embedding coordinates\n        :type strip_embedding:\n        :param strip_dummies: whether to strip all dummy coordinates\n        :type strip_dummies:\n        :param kwargs:\n        :type kwargs:\n        :return:\n        :rtype:\n        '
    n_sys = coords.shape[0]
    n_coords = coords.shape[1]
    n_atoms = len(molecule.atoms)
    if (origins.ndim == 1):
        origins = np.broadcast_to(origins[(np.newaxis, np.newaxis)], (n_sys, 1, 3))
    elif (origins.ndim == 2):
        origins = origins[:, np.newaxis, :]
    if (axes.ndim == 2):
        axes = np.broadcast_to(axes[np.newaxis], (n_sys, 2, 3))
    if (origins.shape[0] != n_sys):
        if ((n_sys % origins.shape[0]) != 0):
            raise ValueError('inconsistent shapes; origins shape {} but coords shape {}'.format(origins.shape, coords.shape))
        num_coords = (n_sys // origins.shape[0])
        origins = np.broadcast_to(origins[:, np.newaxis, :, :], ((origins.shape[0], num_coords) + origins.shape[1:]))
        origins = origins.reshape(((n_sys,) + origins.shape[2:]))
    if (axes.shape[0] != n_sys):
        if ((n_sys % axes.shape[0]) != 0):
            raise ValueError('inconsistent shapes; axes shape {} but coords shape {}'.format(axes.shape, coords.shape))
        num_coords = (n_sys // axes.shape[0])
        axes = np.broadcast_to(axes[:, np.newaxis, :, :], ((axes.shape[0], num_coords) + axes.shape[1:]))
        axes = axes.reshape(((n_sys,) + axes.shape[2:]))
    coords = np.concatenate([origins, (origins + axes), coords], axis=1)
    if (ordering is not None):
        ordering = np.array(ordering, dtype=int)
        ordering[(0, 1)] = (- 3)
        ordering[(0, 2)] = (- 2)
        ordering[(0, 3)] = (- 1)
        ordering[(1, 2)] = (- 2)
        ordering[(1, 3)] = (- 1)
        ordering[(2, 3)] = (- 1)
        ordering = (ordering + 3)
        ordering = np.concatenate([[[0, (- 1), (- 1), (- 1)], [1, 0, (- 1), (- 1)], [2, 0, 1, (- 1)]], ordering])
    res = CoordinateSet(coords, CartesianCoordinates3D).convert(ZMatrixCoordinates, ordering=ordering, origins=origins, axes=axes, **kwargs)
    if isinstance(res, tuple):
        (zmcs, opts) = res
    else:
        zmcs = res
        opts = res.converter_options
    opts['ordering'] = (opts['ordering'][3:] - 3)
    if strip_dummies:
        dummies = ([0, 1, 2] + [(x + 3) for x in molecule.dummy_positions])
    elif strip_embedding:
        dummies = [0, 1, 2]
    else:
        dummies = None
    if (dummies is not None):
        main_excludes = np.setdiff1d(np.arange((len(molecule.atoms) + 3)), dummies)
        sub_excludes = (main_excludes - 1)
        if ('derivs' in opts):
            derivs = opts['derivs']
            reshaped_derivs = ([None] * len(derivs))
            deriv_excludes = np.arange(3, (len(molecule.atoms) + 3))
            for (i, v) in enumerate(derivs):
                start_dim = (v.ndim - (2 * (i + 2)))
                for j in range(start_dim, (v.ndim - 2), 2):
                    v = np.take(v, deriv_excludes, axis=j)
                v = np.take(v, sub_excludes, axis=(- 2))
                reshaped_derivs[i] = v
            opts['derivs'] = reshaped_derivs
        zmcs = zmcs[..., sub_excludes, :]
    return (zmcs, opts)
Converts from Cartesian to ZMatrix coords, preserving the embedding

:param coords: coordinates in Cartesians to convert
:type coords: np.ndarray
:param molecule:
:type molecule: AbstractMolecule
:param origins: the origin for each individual structure
:type origins: np.ndarray
:param axes: the axes for each structure
:type axes: np.ndarray
:param ordering: the Z-matrix ordering spec
:type ordering:
:param strip_embedding: whether to strip the embedding coordinates
:type strip_embedding:
:param strip_dummies: whether to strip all dummy coordinates
:type strip_dummies:
:param kwargs:
:type kwargs:
:return:
:rtype:
def convert_many(self, coords, molecule=None, origins=None, axes=None, ordering=None, strip_embedding=True, strip_dummies=False, **kwargs):
    '\n        Converts from Cartesian to ZMatrix coords, preserving the embedding\n\n        :param coords: coordinates in Cartesians to convert\n        :type coords: np.ndarray\n        :param molecule:\n        :type molecule: AbstractMolecule\n        :param origins: the origin for each individual structure\n        :type origins: np.ndarray\n        :param axes: the axes for each structure\n        :type axes: np.ndarray\n        :param ordering: the Z-matrix ordering spec\n        :type ordering:\n        :param strip_embedding: whether to strip the embedding coordinates\n        :type strip_embedding:\n        :param strip_dummies: whether to strip all dummy coordinates\n        :type strip_dummies:\n        :param kwargs:\n        :type kwargs:\n        :return:\n        :rtype:\n        '
    n_sys = coords.shape[0]
    n_coords = coords.shape[1]
    n_atoms = len(molecule.atoms)
    if (origins.ndim == 1):
        origins = np.broadcast_to(origins[(np.newaxis, np.newaxis)], (n_sys, 1, 3))
    elif (origins.ndim == 2):
        origins = origins[:, np.newaxis, :]
    if (axes.ndim == 2):
        axes = np.broadcast_to(axes[np.newaxis], (n_sys, 2, 3))
    if (origins.shape[0] != n_sys):
        if ((n_sys % origins.shape[0]) != 0):
            raise ValueError('inconsistent shapes; origins shape {} but coords shape {}'.format(origins.shape, coords.shape))
        num_coords = (n_sys // origins.shape[0])
        origins = np.broadcast_to(origins[:, np.newaxis, :, :], ((origins.shape[0], num_coords) + origins.shape[1:]))
        origins = origins.reshape(((n_sys,) + origins.shape[2:]))
    if (axes.shape[0] != n_sys):
        if ((n_sys % axes.shape[0]) != 0):
            raise ValueError('inconsistent shapes; axes shape {} but coords shape {}'.format(axes.shape, coords.shape))
        num_coords = (n_sys // axes.shape[0])
        axes = np.broadcast_to(axes[:, np.newaxis, :, :], ((axes.shape[0], num_coords) + axes.shape[1:]))
        axes = axes.reshape(((n_sys,) + axes.shape[2:]))
    coords = np.concatenate([origins, (origins + axes), coords], axis=1)
    if (ordering is not None):
        ordering = np.array(ordering, dtype=int)
        ordering[(0, 1)] = (- 3)
        ordering[(0, 2)] = (- 2)
        ordering[(0, 3)] = (- 1)
        ordering[(1, 2)] = (- 2)
        ordering[(1, 3)] = (- 1)
        ordering[(2, 3)] = (- 1)
        ordering = (ordering + 3)
        ordering = np.concatenate([[[0, (- 1), (- 1), (- 1)], [1, 0, (- 1), (- 1)], [2, 0, 1, (- 1)]], ordering])
    res = CoordinateSet(coords, CartesianCoordinates3D).convert(ZMatrixCoordinates, ordering=ordering, origins=origins, axes=axes, **kwargs)
    if isinstance(res, tuple):
        (zmcs, opts) = res
    else:
        zmcs = res
        opts = res.converter_options
    opts['ordering'] = (opts['ordering'][3:] - 3)
    if strip_dummies:
        dummies = ([0, 1, 2] + [(x + 3) for x in molecule.dummy_positions])
    elif strip_embedding:
        dummies = [0, 1, 2]
    else:
        dummies = None
    if (dummies is not None):
        main_excludes = np.setdiff1d(np.arange((len(molecule.atoms) + 3)), dummies)
        sub_excludes = (main_excludes - 1)
        if ('derivs' in opts):
            derivs = opts['derivs']
            reshaped_derivs = ([None] * len(derivs))
            deriv_excludes = np.arange(3, (len(molecule.atoms) + 3))
            for (i, v) in enumerate(derivs):
                start_dim = (v.ndim - (2 * (i + 2)))
                for j in range(start_dim, (v.ndim - 2), 2):
                    v = np.take(v, deriv_excludes, axis=j)
                v = np.take(v, sub_excludes, axis=(- 2))
                reshaped_derivs[i] = v
            opts['derivs'] = reshaped_derivs
        zmcs = zmcs[..., sub_excludes, :]
    return (zmcs, opts)