code: def __init__(
      self,
      X: np.ndarray,
      mask: np.ndarray,
      n_obsv: int,
      unique_columns: List[int],
      splittable_variables: List[int],
  ):
      if type(X) == pd.DataFrame:
          X: pd.DataFrame = X
          X = X.values
  
      self._X = X
      self._n_obsv = n_obsv
      self._n_features = X.shape[1]
      self._mask = mask
  
      # Cache initialization
      if unique_columns is not None:
          self._unique_columns = [
              x if x is True else None for x in unique_columns
          ]
      else:
          self._unique_columns = [None for _ in range(self._n_features)]
      if splittable_variables is not None:
          self._splittable_variables = [
              x if x is False else None for x in splittable_variables
          ]
      else:
          self._splittable_variables = [
              None for _ in range(self._n_features)
          ]
      self._max_values = [None] * self._n_features
      self._X_column_cache = [None] * self._n_features
      self._max_value_cache = [None] * self._n_features
      self._X_cache = None
  
imports: from operator import gt, le
  from typing import Any, List, Optional, Union
  import numpy
  import pandas
  from .errors import NoSplittableVariableException
  from .splitcondition import SplitCondition
label_desc: Use image node_id 1 to create a new CovariateMatrix object from inherited base classes: object with example: obj = CovariateMatrix(X, mask, n_obsv, unique_columns, splittable_variables)