| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | 
							- from __future__ import annotations
 
- from ._dtypes import (
 
-     _floating_dtypes,
 
-     _numeric_dtypes,
 
- )
 
- from ._array_object import Array
 
- from ._creation_functions import asarray
 
- from ._dtypes import float32, float64
 
- from typing import TYPE_CHECKING, Optional, Tuple, Union
 
- if TYPE_CHECKING:
 
-     from ._typing import Dtype
 
- import numpy as np
 
- def max(
 
-     x: Array,
 
-     /,
 
-     *,
 
-     axis: Optional[Union[int, Tuple[int, ...]]] = None,
 
-     keepdims: bool = False,
 
- ) -> Array:
 
-     if x.dtype not in _numeric_dtypes:
 
-         raise TypeError("Only numeric dtypes are allowed in max")
 
-     return Array._new(np.max(x._array, axis=axis, keepdims=keepdims))
 
- def mean(
 
-     x: Array,
 
-     /,
 
-     *,
 
-     axis: Optional[Union[int, Tuple[int, ...]]] = None,
 
-     keepdims: bool = False,
 
- ) -> Array:
 
-     if x.dtype not in _floating_dtypes:
 
-         raise TypeError("Only floating-point dtypes are allowed in mean")
 
-     return Array._new(np.mean(x._array, axis=axis, keepdims=keepdims))
 
- def min(
 
-     x: Array,
 
-     /,
 
-     *,
 
-     axis: Optional[Union[int, Tuple[int, ...]]] = None,
 
-     keepdims: bool = False,
 
- ) -> Array:
 
-     if x.dtype not in _numeric_dtypes:
 
-         raise TypeError("Only numeric dtypes are allowed in min")
 
-     return Array._new(np.min(x._array, axis=axis, keepdims=keepdims))
 
- def prod(
 
-     x: Array,
 
-     /,
 
-     *,
 
-     axis: Optional[Union[int, Tuple[int, ...]]] = None,
 
-     dtype: Optional[Dtype] = None,
 
-     keepdims: bool = False,
 
- ) -> Array:
 
-     if x.dtype not in _numeric_dtypes:
 
-         raise TypeError("Only numeric dtypes are allowed in prod")
 
-     # Note: sum() and prod() always upcast float32 to float64 for dtype=None
 
-     # We need to do so here before computing the product to avoid overflow
 
-     if dtype is None and x.dtype == float32:
 
-         dtype = float64
 
-     return Array._new(np.prod(x._array, dtype=dtype, axis=axis, keepdims=keepdims))
 
- def std(
 
-     x: Array,
 
-     /,
 
-     *,
 
-     axis: Optional[Union[int, Tuple[int, ...]]] = None,
 
-     correction: Union[int, float] = 0.0,
 
-     keepdims: bool = False,
 
- ) -> Array:
 
-     # Note: the keyword argument correction is different here
 
-     if x.dtype not in _floating_dtypes:
 
-         raise TypeError("Only floating-point dtypes are allowed in std")
 
-     return Array._new(np.std(x._array, axis=axis, ddof=correction, keepdims=keepdims))
 
- def sum(
 
-     x: Array,
 
-     /,
 
-     *,
 
-     axis: Optional[Union[int, Tuple[int, ...]]] = None,
 
-     dtype: Optional[Dtype] = None,
 
-     keepdims: bool = False,
 
- ) -> Array:
 
-     if x.dtype not in _numeric_dtypes:
 
-         raise TypeError("Only numeric dtypes are allowed in sum")
 
-     # Note: sum() and prod() always upcast integers to (u)int64 and float32 to
 
-     # float64 for dtype=None. `np.sum` does that too for integers, but not for
 
-     # float32, so we need to special-case it here
 
-     if dtype is None and x.dtype == float32:
 
-         dtype = float64
 
-     return Array._new(np.sum(x._array, axis=axis, dtype=dtype, keepdims=keepdims))
 
- def var(
 
-     x: Array,
 
-     /,
 
-     *,
 
-     axis: Optional[Union[int, Tuple[int, ...]]] = None,
 
-     correction: Union[int, float] = 0.0,
 
-     keepdims: bool = False,
 
- ) -> Array:
 
-     # Note: the keyword argument correction is different here
 
-     if x.dtype not in _floating_dtypes:
 
-         raise TypeError("Only floating-point dtypes are allowed in var")
 
-     return Array._new(np.var(x._array, axis=axis, ddof=correction, keepdims=keepdims))
 
 
  |