class_docstr: Iterative estimation of row and column centering/scaling
  using the algorithm from page 31 of:
      Matrix Completion and Low-Rank SVD via Fast Alternating Least Squares
code: def center(self, X, row_means, column_means, inplace=False):
      n_rows, n_cols = X.shape
      row_means = np.asarray(row_means)
      column_means = np.asarray(column_means)
      if len(row_means) != n_rows:
          raise ValueError(
              "Expected length %d but got shape %s"
              % (n_rows, row_means.shape)
          )
      if len(column_means) != n_cols:
          raise ValueError(
              "Expected length %d but got shape %s"
              % (n_cols, column_means.shape)
          )
      if not inplace:
          X = X.copy()
      X -= row_means.reshape((n_rows, 1))
      X -= column_means.reshape((1, n_cols))
      return X
  
imports: import numpy
label_desc: Use image node_id 4 for calling the BiScaler obj's underlying member method code with example usage: obj.center(X, row_means, column_means, inplace) and returns: X