class_docstr: PyVista wrapping of vtkCellArray.
  
  Provides convenience functions to simplify creating a CellArray from
  a numpy array or list.
  
  Parameters
  ----------
  cells : np.ndarray or list, optional
      Import an array of data with the legacy vtkCellArray layout, e.g.
      ``{ n0, p0_0, p0_1, ..., p0_n, n1, p1_0, p1_1, ..., p1_n, ... }``
      Where n0 is the number of points in cell 0, and pX_Y is the Y'th
      point in cell X.
  
  n_cells : int, optional
      The number of cells.
  
  deep : bool, default: False
      Perform a deep copy of the original cell.
  
  Examples
  --------
  Create a cell array containing two triangles from the traditional interleaved format
  
  >>> from pyvista.core.cell import CellArray
  >>> cellarr = CellArray([3, 0, 1, 2, 3, 3, 4, 5])
  
  Create a cell array containing two triangles from separate offsets and connectivity arrays
  
  >>> from pyvista.core.cell import CellArray
  >>> offsets = [0, 3, 6]
  >>> connectivity = [0, 1, 2, 3, 4, 5]
  >>> cellarr = CellArray.from_arrays(offsets, connectivity)
docstr: Set a vtkCellArray.
docstr_tok: ["Set","a","vtkCellArray","."]
code: def _set_cells(
      self, cells: NumpyArray[int], n_cells: Optional[int], deep: bool
  ) -> None:
      """Set a vtkCellArray."""
      vtk_idarr, cells = numpy_to_idarr(cells, deep=deep, return_ind=True)  # type: ignore
  
      # Get number of cells if None.  This is quite a performance
      # bottleneck and we can consider adding a warning.  Good
      # candidate for Cython or JIT compilation
      if n_cells is None:
          if cells.ndim == 1:
              n_cells = ncells_from_cells(cells)
          else:
              n_cells = cells.shape[0]
  
      self.SetCells(n_cells, vtk_idarr)
  
      # https://github.com/pyvista/pyvista/pull/5404
      if self.cells.size != cells.size:
          raise CellSizeError(
              message=(
                  f"Cell array size is invalid. Size ({cells.size}) does not"
                  f" match expected size ({self.cells.size}). This is likely"
                  " due to invalid connectivity array."
              )
          )
  
      self.__offsets = self.__connectivity = None
      return None
  
imports: from __future__ import annotations
  from typing import List, Optional, Sequence, Tuple, Union, cast
  import numpy
  import pyvista
  from .None import _vtk_core
  from ._typing_core import Matrix, NumpyArray, Vector
  from .celltype import CellType
  from .dataset import DataObject
  from .errors import CellSizeError
  from .utilities.cells import ncells_from_cells, numpy_to_idarr
label_desc: Use image node_id 2 for calling the CellArray obj's underlying member method code with example usage: obj._set_cells(cells, n_cells, deep) and returns: None