code: def make_sparse(arr, kind='block', fill_value=None, dtype=None, copy=False):
      
  
      arr = _sanitize_values(arr)
  
      if arr.ndim > 1:
          raise TypeError("expected dimension <= 1 data")
  
      if fill_value is None:
          fill_value = na_value_for_dtype(arr.dtype)
  
      if isna(fill_value):
          mask = notna(arr)
      else:
          # cast to object comparison to be safe
          if is_string_dtype(arr):
              arr = arr.astype(object)
  
          if is_object_dtype(arr.dtype):
              # element-wise equality check method in numpy doesn't treat
              # each element type, eg. 0, 0.0, and False are treated as
              # same. So we have to check the both of its type and value.
              mask = splib.make_mask_object_ndarray(arr, fill_value)
          else:
              mask = arr != fill_value
  
      length = len(arr)
      if length != len(mask):
          # the arr is a SparseArray
          indices = mask.sp_index.indices
      else:
          indices = mask.nonzero()[0].astype(np.int32)
  
      index = _make_index(length, indices, kind)
      sparsified_values = arr[mask]
      if dtype is not None:
          sparsified_values = astype_nansafe(sparsified_values, dtype=dtype)
      # TODO: copy
      return sparsified_values, index, fill_value
docs: Convert ndarray to sparse format
  
      Parameters
      ----------
      arr : ndarray
      kind : {'block', 'integer'}
      fill_value : NaN or another value
      dtype : np.dtype, optional
      copy : bool, default False
  
      Returns
      -------
      (sparse_values, index, fill_value) : (ndarray, SparseIndex, Scalar)