code: def proj_l2ball(b, s, r, axes=None):
      r
  
      d = np.sqrt(np.sum((b - s)**2, axis=axes, keepdims=True))
      p = zdivide(b - s, d)
      return np.asarray((d <= r) * b + (d > r) * (s + r*p), b.dtype)
docs: r"""
      Project :math:`\mathbf{b}` into the :math:`\ell_2` ball of radius
      :math:`r` about :math:`\mathbf{s}`, i.e.
      :math:`\{ \mathbf{x} : \|\mathbf{x} - \mathbf{s} \|_2 \leq r \}`.
      Note that ``proj_l2ball(b, s, r)`` is equivalent to
      :func:`.prox.proj_l2` ``(b - s, r) + s``.
  
      Parameters
      ----------
      b : array_like
        Vector :math:`\mathbf{b}` to be projected
      s : array_like
        Centre of :math:`\ell_2` ball :math:`\mathbf{s}`
      r : float
        Radius of ball
      axes : sequence of ints, optional (default all axes)
        Axes over which to compute :math:`\ell_2` norms
  
      Returns
      -------
      x : ndarray
        Projection of :math:`\mathbf{b}` into ball