diff options
author | Bas van Beek <b.f.van.beek@vu.nl> | 2021-01-11 17:13:56 +0100 |
---|---|---|
committer | Bas van Beek <b.f.van.beek@vu.nl> | 2021-05-12 11:40:08 +0200 |
commit | 2f74022192dfeb89d2a7b7acf5b7428e795c74e4 (patch) | |
tree | 7b03b9cc9e9290a0816409667a202e51d3bb9fc3 | |
parent | 610edf23678a81a9a81d71d238a8f8c1eedcc78a (diff) | |
download | numpy-2f74022192dfeb89d2a7b7acf5b7428e795c74e4.tar.gz |
API: Add a runtime-subscriptable alias for `ndarray`
-rw-r--r-- | numpy/core/_add_newdocs.py | 4 | ||||
-rw-r--r-- | numpy/typing/__init__.py | 1 | ||||
-rw-r--r-- | numpy/typing/_add_docstring.py | 31 | ||||
-rw-r--r-- | numpy/typing/_generic_alias.py | 16 |
4 files changed, 50 insertions, 2 deletions
diff --git a/numpy/core/_add_newdocs.py b/numpy/core/_add_newdocs.py index f870dc8ad..538123149 100644 --- a/numpy/core/_add_newdocs.py +++ b/numpy/core/_add_newdocs.py @@ -2176,6 +2176,8 @@ add_newdoc('numpy.core.multiarray', 'ndarray', empty : Create an array, but leave its allocated memory unchanged (i.e., it contains "garbage"). dtype : Create a data-type. + numpy.typing.NDArray : A :term:`generic <generic type>` version + of ndarray. Notes ----- @@ -5814,7 +5816,7 @@ add_newdoc('numpy.core.multiarray', 'dtype', ('metadata', >>> (arr + arr).dtype.metadata mappingproxy({'key': 'value'}) - But if the arrays have different dtype metadata, the metadata may be + But if the arrays have different dtype metadata, the metadata may be dropped: >>> dt2 = np.dtype(float, metadata={"key2": "value2"}) diff --git a/numpy/typing/__init__.py b/numpy/typing/__init__.py index 8ad07d098..f54108f60 100644 --- a/numpy/typing/__init__.py +++ b/numpy/typing/__init__.py @@ -355,6 +355,7 @@ from ._array_like import ( _ArrayLikeBytes_co, ) from ._generic_alias import ( + NDArray as NDArray, _GenericAlias, ) diff --git a/numpy/typing/_add_docstring.py b/numpy/typing/_add_docstring.py index 8e39fe2c6..1450ce979 100644 --- a/numpy/typing/_add_docstring.py +++ b/numpy/typing/_add_docstring.py @@ -3,6 +3,8 @@ import re import textwrap +from ._generic_alias import NDArray + _docstrings_list = [] @@ -93,4 +95,33 @@ add_newdoc('DTypeLike', 'typing.Union[...]', """) +add_newdoc('NDArray', repr(NDArray), + """ + A :term:`generic <generic type>` version of + `np.ndarray[Any, np.dtype[~ScalarType]] <numpy.ndarray>`. + + Can be used during runtime for typing arrays with a given dtype + and unspecified shape. + + Examples + -------- + .. code-block:: python + + >>> import numpy as np + >>> import numpy.typing as npt + + >>> print(npt.NDArray) + numpy.ndarray[typing.Any, numpy.dtype[~ScalarType]] + + >>> print(npt.NDArray[np.float64]) + numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]] + + >>> NDArrayInt = npt.NDArray[np.int_] + >>> a: NDArrayInt = np.arange(10) + + >>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]: + ... return np.array(a) + + """) + _docstrings = _parse_docstrings() diff --git a/numpy/typing/_generic_alias.py b/numpy/typing/_generic_alias.py index 1a15cbb83..fd719c611 100644 --- a/numpy/typing/_generic_alias.py +++ b/numpy/typing/_generic_alias.py @@ -15,9 +15,12 @@ from typing import ( Tuple, Type, TypeVar, + TYPE_CHECKING, ) -__all__ = ["_GenericAlias"] +import numpy as np + +__all__ = ["_GenericAlias", "NDArray"] _T = TypeVar("_T", bound="_GenericAlias") @@ -192,3 +195,14 @@ if sys.version_info >= (3, 9): _GENERIC_ALIAS_TYPE = (_GenericAlias, types.GenericAlias) else: _GENERIC_ALIAS_TYPE = (_GenericAlias,) + +ScalarType = TypeVar("ScalarType", bound=np.generic) + +if TYPE_CHECKING: + NDArray = np.ndarray[Any, np.dtype[ScalarType]] +elif sys.version_info >= (3, 9): + _DType = types.GenericAlias(np.dtype, (ScalarType,)) + NDArray = types.GenericAlias(np.ndarray, (Any, _DType)) +else: + _DType = _GenericAlias(np.dtype, (ScalarType,)) + NDArray = _GenericAlias(np.ndarray, (Any, _DType)) |