code: def blocksplit_dtrajs(dtrajs, lag=1, sliding=True, shift=None):
      
      dtrajs_new = []
      for dtraj in dtrajs:
          if len(dtraj) <= lag:
              continue
          if shift is None:
              s = np.random.randint(min(lag, dtraj.size-lag))
          else:
              s = shift
          if sliding:
              if s > 0:
                  dtrajs_new.append(dtraj[0:lag+s])
              for t0 in range(s, dtraj.size-lag, lag):
                  dtrajs_new.append(dtraj[t0:t0+2*lag])
          else:
              for t0 in range(s, dtraj.size-lag, lag):
                  dtrajs_new.append(dtraj[t0:t0+lag+1])
      return dtrajs_new
docs: Splits the discrete trajectories into approximately uncorrelated fragments
  
      Will split trajectories into fragments of lengths lag or longer. These fragments
      are overlapping in order to conserve the transition counts at given lag.
      If sliding=True, the resulting trajectories will lead to exactly the same count
      matrix as when counted from dtrajs. If sliding=False (sampling at lag), the
      count matrices are only equal when also setting shift=0.
  
      Parameters
      ----------
      dtrajs : list of ndarray(int)
          Discrete trajectories
      lag : int
          Lag time at which counting will be done. If sh
      sliding : bool
          True for splitting trajectories for sliding count, False if lag-sampling will be applied
      shift : None or int
          Start of first full tau-window. If None, shift will be randomly generated