docs: def histogramdd(data, bins=10, *args, **kwargs):
      """Facade function to create n-dimensional histograms.
  
      3D variant of this function is also aliased as "h3".
  
      Parameters
      ----------
      data : array_like
          Container of all the values
      bins: Any
      weights: array_like, optional
          (as numpy.histogram)
      dropna: bool
          whether to clear data from nan's before histogramming
      name: str
          name of the histogram
      axis_names: Iterable[str]
          names of the variable on x axis
      adaptive:
          whether the bins should be updated when new non-fitting value are filled
      dtype: Optional[type]
          Underlying type for the histogram.
          If weights are specified, default is float. Otherwise int64
      dim: int
          Dimension - necessary if you are creating an empty adaptive histogram
  
      Returns
      -------
      physt.histogram_nd.HistogramND
  
      See Also
      --------
      numpy.histogramdd
      """
      import numpy as np
      from . import histogram_nd
      from .binnings import calculate_bins_nd
  
      adaptive = kwargs.pop("adaptive", False)
      dropna = kwargs.pop("dropna", True)
      name = kwargs.pop("name", None)
      title = kwargs.pop("title", None)
      dim = kwargs.pop("dim", None)
      axis_names = kwargs.pop("axis_names", None)
  
      # pandas - guess axis names
      if not "axis_names" in kwargs:
          if hasattr(data, "columns"):
              try:
                  kwargs["axis_names"] = tuple(data.columns)
              except:
                  pass # Perhaps columns has different meaning here.
  
      # Prepare and check data
      # Convert to array
      if data is not None:
          data = np.asarray(data)
          if data.ndim != 2:
              raise RuntimeError("Array must have shape (n, d)")
          if dim is not None and dim != data.shape[1]:
              raise RuntimeError("Dimension mismatch: {0}!={1}".format(dim, data.shape[1]))
          _, dim = data.shape
          if dropna:
              data = data[~np.isnan(data).any(axis=1)]
          check_nan = not dropna
      else:
          if dim is None:
              raise RuntimeError("You have to specify either data or its dimension.")
          data = np.zeros((0, dim))
          check_nan = False
  
      # Prepare bins
      bin_schemas = calculate_bins_nd(data, bins, *args, check_nan=check_nan, adaptive=adaptive,
                                      **kwargs)
      #bins = [binning.bins for binning in bin_schemas]
  
      # Prepare remaining data
      weights = kwargs.pop("weights", None)
      frequencies, errors2, missed = histogram_nd.calculate_frequencies(data, ndim=dim,
                                                                        binnings=bin_schemas,
                                                                        weights=weights)
  
      kwargs["name"] = name
      if title:
          kwargs["title"] = title
      if axis_names:
          kwargs["axis_names"] = axis_names
      if dim == 2:
          return histogram_nd.Histogram2D(binnings=bin_schemas, frequencies=frequencies,
                                          errors2=errors2, **kwargs)
      else:
          return histogram_nd.HistogramND(dimension=dim, binnings=bin_schemas,
                                          frequencies=frequencies, errors2=errors2, **kwargs)