docs: def _extract_shape(idx, x, j, cur_center):
      """
      >>> _extract_shape(np.array([0,1,2]), np.array([[1,2,3], [4,5,6]]), 1, np.array([0,3,4]))
      array([-1.,  0.,  1.])
      >>> _extract_shape(np.array([0,1,2]), np.array([[-1,2,3], [4,-5,6]]), 1, np.array([0,3,4]))
      array([-0.96836405,  1.02888681, -0.06052275])
      >>> _extract_shape(np.array([1,0,1,0]), np.array([[1,2,3,4], [0,1,2,3], [-1,1,-1,1], [1,2,2,3]]), 0, np.array([0,0,0,0]))
      array([-1.2089303 , -0.19618238,  0.19618238,  1.2089303 ])
      >>> _extract_shape(np.array([0,0,1,0]), np.array([[1,2,3,4],[0,1,2,3],[-1,1,-1,1],[1,2,2,3]]), 0, np.array([-1.2089303,-0.19618238,0.19618238,1.2089303]))
      array([-1.19623139, -0.26273649,  0.26273649,  1.19623139])
      """
      _a = []
      for i in range(len(idx)):
          if idx[i] == j:
              if cur_center.sum() == 0:
                  opt_x = x[i]
              else:
                  _, opt_x = _sbd(cur_center, x[i])
              _a.append(opt_x)
      a = np.array(_a)
  
      if len(a) == 0:
          return np.zeros((1, x.shape[1]))
      columns = a.shape[1]
      y = zscore(a, axis=1, ddof=1)
      s = np.dot(y.transpose(), y)
  
      p = np.empty((columns, columns))
      p.fill(1.0/columns)
      p = np.eye(columns) - p
  
      m = np.dot(np.dot(p, s), p)
      _, vec = eigh(m)
      centroid = vec[:, -1]
      finddistance1 = math.sqrt(((a[0] - centroid) ** 2).sum())
      finddistance2 = math.sqrt(((a[0] + centroid) ** 2).sum())
  
      if finddistance1 >= finddistance2:
          centroid *= -1
  
      return zscore(centroid, ddof=1)