parameters: (padded, axis, width_pair, method, include_edge=False)
return_statement: return left_pad, right_pad
docstring: Pad `axis` of `arr` with reflection.
  
      Parameters
      ----------
      padded : ndarray
          Input array of arbitrary shape.
      axis : int
          Axis along which to pad `arr`.
      width_pair : (int, int)
          Pair of widths that mark the pad area on both sides in the given
          dimension.
      method : str
          Controls method of reflection; options are 'even' or 'odd'.
      include_edge : bool
          If true, edge value is included in reflection, otherwise the edge
          value forms the symmetric axis to the reflection.
  
      Returns
      -------
      pad_amt : tuple of ints, length 2
          New index positions of padding to do along the `axis`. If these are
          both 0, padding is done in this dimension.
docstring_summary: Pad `axis` of `arr` with reflection.
docstring_tokens: Pad axis of arr with reflection .
function: def _set_reflect_both(padded, axis, width_pair, method, include_edge=False):
      """
      Pad `axis` of `arr` with reflection.
  
      Parameters
      ----------
      padded : ndarray
          Input array of arbitrary shape.
      axis : int
          Axis along which to pad `arr`.
      width_pair : (int, int)
          Pair of widths that mark the pad area on both sides in the given
          dimension.
      method : str
          Controls method of reflection; options are 'even' or 'odd'.
      include_edge : bool
          If true, edge value is included in reflection, otherwise the edge
          value forms the symmetric axis to the reflection.
  
      Returns
      -------
      pad_amt : tuple of ints, length 2
          New index positions of padding to do along the `axis`. If these are
          both 0, padding is done in this dimension.
      """
      left_pad, right_pad = width_pair
      old_length = padded.shape[axis] - right_pad - left_pad
  
      if include_edge:
          # Edge is included, we need to offset the pad amount by 1
          edge_offset = 1
      else:
          edge_offset = 0  # Edge is not included, no need to offset pad amount
          old_length -= 1  # but must be omitted from the chunk
  
      if left_pad > 0:
          # Pad with reflected values on left side:
          # First limit chunk size which can't be larger than pad area
          chunk_length = min(old_length, left_pad)
          # Slice right to left, stop on or next to edge, start relative to stop
          stop = left_pad - edge_offset
          start = stop + chunk_length
          left_slice = _slice_at_axis(slice(start, stop, -1), axis)
          left_chunk = padded[left_slice]
  
          if method == "odd":
              # Negate chunk and align with edge
              edge_slice = _slice_at_axis(slice(left_pad, left_pad + 1), axis)
              left_chunk = 2 * padded[edge_slice] - left_chunk
  
          # Insert chunk into padded area
          start = left_pad - chunk_length
          stop = left_pad
          pad_area = _slice_at_axis(slice(start, stop), axis)
          padded[pad_area] = left_chunk
          # Adjust pointer to left edge for next iteration
          left_pad -= chunk_length
  
      if right_pad > 0:
          # Pad with reflected values on right side:
          # First limit chunk size which can't be larger than pad area
          chunk_length = min(old_length, right_pad)
          # Slice right to left, start on or next to edge, stop relative to start
          start = -right_pad + edge_offset - 2
          stop = start - chunk_length
          right_slice = _slice_at_axis(slice(start, stop, -1), axis)
          right_chunk = padded[right_slice]
  
          if method == "odd":
              # Negate chunk and align with edge
              edge_slice = _slice_at_axis(
                  slice(-right_pad - 1, -right_pad), axis)
              right_chunk = 2 * padded[edge_slice] - right_chunk
  
          # Insert chunk into padded area
          start = padded.shape[axis] - right_pad
          stop = start + chunk_length
          pad_area = _slice_at_axis(slice(start, stop), axis)
          padded[pad_area] = right_chunk
          # Adjust pointer to right edge for next iteration
          right_pad -= chunk_length
  
      return left_pad, right_pad
function_tokens: def _set_reflect_both ( padded , axis , width_pair , method , include_edge = False ) : left_pad , right_pad = width_pair old_length = padded . shape [ axis ] - right_pad - left_pad if include_edge : # Edge is included, we need to offset the pad amount by 1 edge_offset = 1 else : edge_offset = 0 # Edge is not included, no need to offset pad amount old_length -= 1 # but must be omitted from the chunk if left_pad > 0 : # Pad with reflected values on left side: # First limit chunk size which can't be larger than pad area chunk_length = min ( old_length , left_pad ) # Slice right to left, stop on or next to edge, start relative to stop stop = left_pad - edge_offset start = stop + chunk_length left_slice = _slice_at_axis ( slice ( start , stop , - 1 ) , axis ) left_chunk = padded [ left_slice ] if method == "odd" : # Negate chunk and align with edge edge_slice = _slice_at_axis ( slice ( left_pad , left_pad + 1 ) , axis ) left_chunk = 2 * padded [ edge_slice ] - left_chunk # Insert chunk into padded area start = left_pad - chunk_length stop = left_pad pad_area = _slice_at_axis ( slice ( start , stop ) , axis ) padded [ pad_area ] = left_chunk # Adjust pointer to left edge for next iteration left_pad -= chunk_length if right_pad > 0 : # Pad with reflected values on right side: # First limit chunk size which can't be larger than pad area chunk_length = min ( old_length , right_pad ) # Slice right to left, start on or next to edge, stop relative to start start = - right_pad + edge_offset - 2 stop = start - chunk_length right_slice = _slice_at_axis ( slice ( start , stop , - 1 ) , axis ) right_chunk = padded [ right_slice ] if method == "odd" : # Negate chunk and align with edge edge_slice = _slice_at_axis ( slice ( - right_pad - 1 , - right_pad ) , axis ) right_chunk = 2 * padded [ edge_slice ] - right_chunk # Insert chunk into padded area start = padded . shape [ axis ] - right_pad stop = start + chunk_length pad_area = _slice_at_axis ( slice ( start , stop ) , axis ) padded [ pad_area ] = right_chunk # Adjust pointer to right edge for next iteration right_pad -= chunk_length return left_pad , right_pad