docstr: It will return a count of search element for each tuple.
  The idea is to flatten the input array along the first dimension and
  count the search element in this flattened array.
  For example,
  a tuple of shape (3,4,5) will be flattened into three (4,5) elements.
  And the search key is expected to be of shape (4,5),
  else we throw an error.
  
  frames: DataFrame
      col1        col2
  0   ndarray1    search_key
  1   ndarray2    search_key
  
  out: DataFrame
      count
  0   int
  1   int
code: def forward(self, frames: pd.DataFrame) -> pd.DataFrame:
      """
      It will return a count of search element for each tuple.
      The idea is to flatten the input array along the first dimension and
      count the search element in this flattened array.
      For example,
      a tuple of shape (3,4,5) will be flattened into three (4,5) elements.
      And the search key is expected to be of shape (4,5),
      else we throw an error.
  
      frames: DataFrame
          col1        col2
      0   ndarray1    search_key
      1   ndarray2    search_key
  
      out: DataFrame
          count
      0   int
      1   int
  
      """
      # sanity check
      if len(frames.columns) != 2:
          raise ValueError("input contains more than one column")
  
      search_element = frames[frames.columns[-1]][0]
      values = pd.DataFrame(frames[frames.columns[0]])
  
      count_result = values.apply(
          lambda x: self.count_in_row(x[0], search_element), axis=1
      )
  
      return pd.DataFrame({"key_count": count_result.values})
  
file_path: evadb/evadb/functions/ndarray/array_count.py
imports: import numpy
  import pandas
  from evadb.functions.abstract.abstract_function import AbstractFunction
label_desc: Use image node_id 3 for calling the ArrayCount obj's underlying member method code with example usage: obj.forward(frames) and returns: pd