code: def preprocess_array(cls, arr, features, parameters):
      assert len(arr.shape) == 2 and arr.shape[1] == len(features)
      preprocessed_values = [
          cls.preprocess(
              {f: v for f, v in zip(features, row)}, parameters
          )
          for row in arr
      ]
      return np.array(
          [[ex[f] for f in features] for ex in preprocessed_values],
          dtype=np.float32,
      )
  
file_path: ReAgent/reagent/test/base/utils.py
imports: import collections
  import csv
  import numpy
  import six
  from reagent.preprocessing import identify_types
  from reagent.preprocessing.normalization import BOX_COX_MARGIN, MAX_FEATURE_VALUE, MIN_FEATURE_VALUE, MISSING_VALUE, NormalizationParameters
  from scipy import special, stats
label_desc: Use image node_id 4 for calling the NumpyFeatureProcessor obj's underlying member method code with example usage: obj.preprocess_array(cls, arr, features, parameters) and returns: np