summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBas van Beek <b.f.van.beek@vu.nl>2021-01-11 17:13:56 +0100
committerBas van Beek <b.f.van.beek@vu.nl>2021-05-12 11:40:08 +0200
commit2f74022192dfeb89d2a7b7acf5b7428e795c74e4 (patch)
tree7b03b9cc9e9290a0816409667a202e51d3bb9fc3
parent610edf23678a81a9a81d71d238a8f8c1eedcc78a (diff)
downloadnumpy-2f74022192dfeb89d2a7b7acf5b7428e795c74e4.tar.gz
API: Add a runtime-subscriptable alias for `ndarray`
-rw-r--r--numpy/core/_add_newdocs.py4
-rw-r--r--numpy/typing/__init__.py1
-rw-r--r--numpy/typing/_add_docstring.py31
-rw-r--r--numpy/typing/_generic_alias.py16
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))