class_docstr: MultiInterface allows wrapping around a list of tabular datasets
  including dataframes, the columnar dictionary format or 2D tabular
  NumPy arrays. Using the split method the list of tabular data can
  be split into individual datasets.
  
  The interface makes the data appear a list of tabular datasets as
  a single dataset. The interface may be used to represent geometries
  so the behavior depends on the type of geometry being represented.
class_docstr_tok: ["MultiInterface","allows","wrapping","around","a","list","of","tabular","datasets","including","dataframes",",","the","columnar","dictionary","format","or","2D","tabular","NumPy","arrays",".","Using","the","split","method","the","list","of","tabular","data","can","be","split","into","individual","datasets",".","The","interface","makes","the","data","appear","a","list","of","tabular","datasets","as","a","single","dataset",".","The","interface","may","be","used","to","represent","geometries","so","the","behavior","depends","on","the","type","of","geometry","being","represented","."]
docstr: Returns a single concatenated array of all subpaths separated
  by NaN values. If expanded keyword is False an array of arrays
  is returned.
docstr_tok: ["Returns","a","single","concatenated","array","of","all","subpaths","separated","by","NaN","values",".","If","expanded","keyword","is","False","an","array","of","arrays","is","returned","."]
code: def values(
      cls,
      dataset,
      dimension,
      expanded=True,
      flat=True,
      compute=True,
      keep_index=False,
  ):
      """
      Returns a single concatenated array of all subpaths separated
      by NaN values. If expanded keyword is False an array of arrays
      is returned.
      """
      if not dataset.data:
          return np.array([])
      values, scalars = [], []
      all_scalar = True
      ds = cls._inner_dataset_template(dataset)
      geom_type = cls.geom_type(dataset)
      is_points = geom_type == "Point"
      is_geom = dimension in dataset.kdims[:2]
      for d in dataset.data:
          ds.data = d
          dvals = ds.interface.values(
              ds, dimension, True, flat, compute, keep_index
          )
          scalar = len(util.unique_array(dvals)) == 1 and not is_geom
          gt = (
              ds.interface.geom_type(ds)
              if hasattr(ds.interface, "geom_type")
              else None
          )
  
          if gt is None:
              gt = geom_type
  
          if (
              gt in ("Polygon", "Ring")
              and (not scalar or expanded)
              and not geom_type == "Points"
              and len(dvals)
          ):
              gvals = ds.array([0, 1])
              dvals = ensure_ring(gvals, dvals)
          if scalar and not expanded:
              dvals = dvals[:1]
          all_scalar &= scalar
  
          scalars.append(scalar)
          if not len(dvals):
              continue
          values.append(dvals)
          if not is_points and expanded:
              values.append([np.nan])
  
      if not values:
          return np.array([])
      elif expanded or (all_scalar and not is_geom):
          if not is_points and expanded:
              values = values[:-1]
          return np.concatenate(values) if values else np.array([])
      else:
          array = np.empty(len(values), dtype=object)
          array[:] = [a[0] if s else a for s, a in zip(scalars, values)]
          return array
  
imports: import numpy
  from ..None import util
  from ..element import Element
  from ..ndmapping import NdMapping, item_check, sorted_context
  from .dictionary import DictInterface
  from .interface import DataError, Interface
label_desc: Use image node_id 23 for calling the MultiInterface obj's underlying member method code with example usage: obj.values(cls, dataset, dimension, expanded, flat, compute, keep_index) and returns: np, np, unknown, array