code: def geostrophic_wind(heights, f, dx, dy):
      r
      if heights.dimensionality['[length]'] == 2.0:
          norm_factor = 1. / f
      else:
          norm_factor = mpconsts.g / f
  
      dhdy = first_derivative(heights, delta=dy, axis=-2)
      dhdx = first_derivative(heights, delta=dx, axis=-1)
      return -norm_factor * dhdy, norm_factor * dhdx
docs: r"""Calculate the geostrophic wind given from the heights or geopotential.
  
      Parameters
      ----------
      heights : (M, N) ndarray
          The height field, with either leading dimensions of (x, y) or trailing dimensions
          of (y, x), depending on the value of ``dim_order``.
      f : array_like
          The coriolis parameter.  This can be a scalar to be applied
          everywhere or an array of values.
      dx : float or ndarray
          The grid spacing(s) in the x-direction. If an array, there should be one item less than
          the size of `heights` along the applicable axis.
      dy : float or ndarray
          The grid spacing(s) in the y-direction. If an array, there should be one item less than
          the size of `heights` along the applicable axis.
  
      Returns
      -------
      A 2-item tuple of arrays
          A tuple of the u-component and v-component of the geostrophic wind.
  
      Notes
      -----
      If inputs have more than two dimensions, they are assumed to have either leading dimensions
      of (x, y) or trailing dimensions of (y, x), depending on the value of ``dim_order``.