parameters: (N, M=None, k=0, dtype=float)
return_statement: return m
docstring: An array with ones at and below the given diagonal and zeros elsewhere.
  
      Parameters
      ----------
      N : int
          Number of rows in the array.
      M : int, optional
          Number of columns in the array.
          By default, `M` is taken equal to `N`.
      k : int, optional
          The sub-diagonal at and below which the array is filled.
          `k` = 0 is the main diagonal, while `k` < 0 is below it,
          and `k` > 0 is above.  The default is 0.
      dtype : dtype, optional
          Data type of the returned array.  The default is float.
  
      Returns
      -------
      tri : ndarray of shape (N, M)
          Array with its lower triangle filled with ones and zero elsewhere;
          in other words ``T[i,j] == 1`` for ``i <= j + k``, 0 otherwise.
  
      Examples
      --------
      >>> np.tri(3, 5, 2, dtype=int)
      array([[1, 1, 1, 0, 0],
             [1, 1, 1, 1, 0],
             [1, 1, 1, 1, 1]])
  
      >>> np.tri(3, 5, -1)
      array([[ 0.,  0.,  0.,  0.,  0.],
             [ 1.,  0.,  0.,  0.,  0.],
             [ 1.,  1.,  0.,  0.,  0.]])
docstring_summary: An array with ones at and below the given diagonal and zeros elsewhere.
docstring_tokens: An array with ones at and below the given diagonal and zeros elsewhere .
function: def tri(N, M=None, k=0, dtype=float):
      """
      An array with ones at and below the given diagonal and zeros elsewhere.
  
      Parameters
      ----------
      N : int
          Number of rows in the array.
      M : int, optional
          Number of columns in the array.
          By default, `M` is taken equal to `N`.
      k : int, optional
          The sub-diagonal at and below which the array is filled.
          `k` = 0 is the main diagonal, while `k` < 0 is below it,
          and `k` > 0 is above.  The default is 0.
      dtype : dtype, optional
          Data type of the returned array.  The default is float.
  
      Returns
      -------
      tri : ndarray of shape (N, M)
          Array with its lower triangle filled with ones and zero elsewhere;
          in other words ``T[i,j] == 1`` for ``i <= j + k``, 0 otherwise.
  
      Examples
      --------
      >>> np.tri(3, 5, 2, dtype=int)
      array([[1, 1, 1, 0, 0],
             [1, 1, 1, 1, 0],
             [1, 1, 1, 1, 1]])
  
      >>> np.tri(3, 5, -1)
      array([[ 0.,  0.,  0.,  0.,  0.],
             [ 1.,  0.,  0.,  0.,  0.],
             [ 1.,  1.,  0.,  0.,  0.]])
  
      """
      if M is None:
          M = N
  
      m = greater_equal.outer(arange(N, dtype=_min_int(0, N)),
                              arange(-k, M-k, dtype=_min_int(-k, M - k)))
  
      # Avoid making a copy if the requested type is already bool
      m = m.astype(dtype, copy=False)
  
      return m
function_tokens: def tri ( N , M = None , k = 0 , dtype = float ) : if M is None : M = N m = greater_equal . outer ( arange ( N , dtype = _min_int ( 0 , N ) ) , arange ( - k , M - k , dtype = _min_int ( - k , M - k ) ) ) # Avoid making a copy if the requested type is already bool m = m . astype ( dtype , copy = False ) return m