def METHOD_NAME(cls, values, row_splits, validate=True, copy=True):
    """Creates a RaggedTensor with rows partitioned by row_splits.
    The returned `RaggedTensor` corresponds with the python list defined by::
        result = [values[row_splits[i]:row_splits[i + 1]]
                for i in range(len(row_splits) - 1)]
    Args:
        values: A Tensor with shape [N, None].
        row_splits: A 1-D integer tensor with shape `[N+1]`. Must not be
            empty, and must be stored in ascending order. `row_splits[0]` must
            be zero and `row_splits[-1]` must be `N`.
        validate: Verify that `row_splits` are compatible with `values`.
            Set it to False to avoid expensive checks.
        copy: Whether to do a deep copy for `values` and `row_splits`.
            Set it to False to save memory for short term usage.
    Returns:
        A `RaggedTensor` container.
    Example:
    >>> print(ml3d.classes.RaggedTensor.from_row_splits(
    ...     values=[3, 1, 4, 1, 5, 9, 2, 6],
    ...     row_splits=[0, 4, 4, 7, 8, 8]))
    <RaggedTensor [[3, 1, 4, 1], [], [5, 9, 2], [6], []]>
    """
    if isinstance(values, list):
        values = torch.tensor(values, dtype=torch.float64)
    elif isinstance(values, np.ndarray):
        values = torch.from_numpy(values)
    elif isinstance(values, torch.Tensor) and copy:
        values = values.clone()
    if isinstance(row_splits, list):
        row_splits = torch.tensor(row_splits, dtype=torch.int64)
    elif isinstance(row_splits, np.ndarray):
        row_splits = torch.from_numpy(row_splits)
    elif isinstance(row_splits, torch.Tensor) and copy:
        row_splits = row_splits.clone()
    r_tensor = torch.classes.my_classes.RaggedTensor().METHOD_NAME(
        values, row_splits, validate)
    return cls(r_tensor, internal=True)