diff --git a/src/numpy-stubs/_core/shape_base.pyi b/src/numpy-stubs/_core/shape_base.pyi index 8f9738fe..e61afc05 100644 --- a/src/numpy-stubs/_core/shape_base.pyi +++ b/src/numpy-stubs/_core/shape_base.pyi @@ -1,98 +1,196 @@ from collections.abc import Sequence -from typing import Any, SupportsIndex, overload -from typing_extensions import TypeVar +from typing import Any, SupportsIndex, TypeAlias, overload +from typing_extensions import TypeVar, Unpack import numpy as np from numpy._typing import ArrayLike, DTypeLike, NDArray, _ArrayLike, _DTypeLike __all__ = ["atleast_1d", "atleast_2d", "atleast_3d", "block", "hstack", "stack", "unstack", "vstack"] +### + _SCT = TypeVar("_SCT", bound=np.generic) +_SCT0 = TypeVar("_SCT0", bound=np.generic) +_SCT1 = TypeVar("_SCT1", bound=np.generic) + _ArrayT = TypeVar("_ArrayT", bound=NDArray[Any]) +_Array1T = TypeVar("_Array1T", bound=np.ndarray[_AtLeast1D, np.dtype[Any]]) +_Array1T0 = TypeVar("_Array1T0", bound=np.ndarray[_AtLeast1D, np.dtype[Any]]) +_Array1T1 = TypeVar("_Array1T1", bound=np.ndarray[_AtLeast1D, np.dtype[Any]]) + +_Array2T = TypeVar("_Array2T", bound=np.ndarray[_AtLeast2D, np.dtype[Any]]) +_Array2T0 = TypeVar("_Array2T0", bound=np.ndarray[_AtLeast2D, np.dtype[Any]]) +_Array2T1 = TypeVar("_Array2T1", bound=np.ndarray[_AtLeast2D, np.dtype[Any]]) + +_Array3T = TypeVar("_Array3T", bound=np.ndarray[_AtLeast3D, np.dtype[Any]]) +_Array3T0 = TypeVar("_Array3T0", bound=np.ndarray[_AtLeast3D, np.dtype[Any]]) +_Array3T1 = TypeVar("_Array3T1", bound=np.ndarray[_AtLeast3D, np.dtype[Any]]) + +_AtLeast1D: TypeAlias = tuple[int, Unpack[tuple[int, ...]]] +_AtLeast2D: TypeAlias = tuple[int, int, Unpack[tuple[int, ...]]] +_AtLeast3D: TypeAlias = tuple[int, int, int, Unpack[tuple[int, ...]]] + +### + # @overload -def atleast_1d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ... +def atleast_1d(a0: _Array1T, /) -> _Array1T: ... +@overload +def atleast_1d(a0: _Array1T0, a1: _Array1T1, /) -> tuple[_Array1T0, _Array1T1]: ... +@overload +def atleast_1d(a0: _Array1T, a1: _Array1T, /, *arys: _Array1T) -> tuple[_Array1T, ...]: ... +@overload +def atleast_1d(a0: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ... +@overload +def atleast_1d(a0: _ArrayLike[_SCT0], a2: _ArrayLike[_SCT1], /) -> tuple[NDArray[_SCT0], NDArray[_SCT1]]: ... @overload -def atleast_1d(arys: ArrayLike, /) -> NDArray[Any]: ... +def atleast_1d(a0: _ArrayLike[_SCT], a2: _ArrayLike[_SCT], /, *arys: _ArrayLike[_SCT]) -> tuple[NDArray[_SCT], ...]: ... @overload -def atleast_1d(*arys: ArrayLike) -> tuple[NDArray[Any], ...]: ... +def atleast_1d(a0: ArrayLike, /) -> NDArray[Any]: ... +@overload +def atleast_1d(a0: ArrayLike, a2: ArrayLike, /) -> tuple[NDArray[Any], NDArray[Any]]: ... +@overload +def atleast_1d(a0: ArrayLike, a2: ArrayLike, /, *arys: ArrayLike) -> tuple[NDArray[Any], ...]: ... # @overload -def atleast_2d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ... +def atleast_2d(a0: _Array2T, /) -> _Array2T: ... +@overload +def atleast_2d(a0: _Array2T0, a1: _Array2T1, /) -> tuple[_Array2T0, _Array2T1]: ... +@overload +def atleast_2d(a0: _Array2T, a1: _Array2T, /, *arys: _Array2T) -> tuple[_Array2T, ...]: ... +@overload +def atleast_2d(a0: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ... +@overload +def atleast_2d(a0: _ArrayLike[_SCT0], a2: _ArrayLike[_SCT1], /) -> tuple[NDArray[_SCT0], NDArray[_SCT1]]: ... @overload -def atleast_2d(arys: ArrayLike, /) -> NDArray[Any]: ... +def atleast_2d(a0: _ArrayLike[_SCT], a2: _ArrayLike[_SCT], /, *arys: _ArrayLike[_SCT]) -> tuple[NDArray[_SCT], ...]: ... @overload -def atleast_2d(*arys: ArrayLike) -> tuple[NDArray[Any], ...]: ... +def atleast_2d(a0: ArrayLike, /) -> NDArray[Any]: ... +@overload +def atleast_2d(a0: ArrayLike, a2: ArrayLike, /) -> tuple[NDArray[Any], NDArray[Any]]: ... +@overload +def atleast_2d(a0: ArrayLike, a2: ArrayLike, /, *arys: ArrayLike) -> tuple[NDArray[Any], ...]: ... # @overload -def atleast_3d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ... +def atleast_3d(a0: _Array3T, /) -> _Array3T: ... +@overload +def atleast_3d(a0: _Array3T0, a1: _Array3T1, /) -> tuple[_Array3T0, _Array3T1]: ... +@overload +def atleast_3d(a0: _Array3T, a1: _Array3T, /, *arys: _Array3T) -> tuple[_Array3T, ...]: ... +@overload +def atleast_3d(a0: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ... @overload -def atleast_3d(arys: ArrayLike, /) -> NDArray[Any]: ... +def atleast_3d(a0: _ArrayLike[_SCT0], a2: _ArrayLike[_SCT1], /) -> tuple[NDArray[_SCT0], NDArray[_SCT1]]: ... @overload -def atleast_3d(*arys: ArrayLike) -> tuple[NDArray[Any], ...]: ... +def atleast_3d(a0: _ArrayLike[_SCT], a2: _ArrayLike[_SCT], /, *arys: _ArrayLike[_SCT]) -> tuple[NDArray[_SCT], ...]: ... +@overload +def atleast_3d(a0: ArrayLike, /) -> NDArray[Any]: ... +@overload +def atleast_3d(a0: ArrayLike, a2: ArrayLike, /) -> tuple[NDArray[Any], NDArray[Any]]: ... +@overload +def atleast_3d(a0: ArrayLike, a2: ArrayLike, /, *arys: ArrayLike) -> tuple[NDArray[Any], ...]: ... # @overload -def vstack(tup: Sequence[_ArrayLike[_SCT]], *, dtype: None = ..., casting: np._CastingKind = ...) -> NDArray[_SCT]: ... +def vstack( + tup: Sequence[_ArrayLike[_SCT]], + *, + dtype: None = None, + casting: np._CastingKind = "same_kind", +) -> NDArray[_SCT]: ... @overload -def vstack(tup: Sequence[ArrayLike], *, dtype: _DTypeLike[_SCT], casting: np._CastingKind = ...) -> NDArray[_SCT]: ... +def vstack( + tup: Sequence[ArrayLike], + *, + dtype: _DTypeLike[_SCT], + casting: np._CastingKind = "same_kind", +) -> NDArray[_SCT]: ... @overload -def vstack(tup: Sequence[ArrayLike], *, dtype: DTypeLike = ..., casting: np._CastingKind = ...) -> NDArray[Any]: ... +def vstack( + tup: Sequence[ArrayLike], + *, + dtype: DTypeLike | None = None, + casting: np._CastingKind = "same_kind", +) -> NDArray[Any]: ... # @overload -def hstack(tup: Sequence[_ArrayLike[_SCT]], *, dtype: None = ..., casting: np._CastingKind = ...) -> NDArray[_SCT]: ... +def hstack( + tup: Sequence[_ArrayLike[_SCT]], + *, + dtype: None = None, + casting: np._CastingKind = "same_kind", +) -> NDArray[_SCT]: ... @overload -def hstack(tup: Sequence[ArrayLike], *, dtype: _DTypeLike[_SCT], casting: np._CastingKind = ...) -> NDArray[_SCT]: ... +def hstack( + tup: Sequence[ArrayLike], + *, + dtype: _DTypeLike[_SCT], + casting: np._CastingKind = "same_kind", +) -> NDArray[_SCT]: ... @overload -def hstack(tup: Sequence[ArrayLike], *, dtype: DTypeLike = ..., casting: np._CastingKind = ...) -> NDArray[Any]: ... +def hstack( + tup: Sequence[ArrayLike], + *, + dtype: DTypeLike | None = None, + casting: np._CastingKind = "same_kind", +) -> NDArray[Any]: ... # @overload def stack( arrays: Sequence[_ArrayLike[_SCT]], - axis: SupportsIndex = ..., - out: None = ..., + axis: SupportsIndex = 0, + out: None = None, *, - dtype: None = ..., - casting: np._CastingKind = ..., + dtype: None = None, + casting: np._CastingKind = "same_kind", ) -> NDArray[_SCT]: ... @overload def stack( arrays: Sequence[ArrayLike], - axis: SupportsIndex = ..., - out: None = ..., + axis: SupportsIndex = 0, + out: None = None, *, dtype: _DTypeLike[_SCT], - casting: np._CastingKind = ..., + casting: np._CastingKind = "same_kind", ) -> NDArray[_SCT]: ... @overload def stack( arrays: Sequence[ArrayLike], - axis: SupportsIndex = ..., - out: None = ..., + axis: SupportsIndex = 0, + out: None = None, *, - dtype: DTypeLike = ..., - casting: np._CastingKind = ..., + dtype: DTypeLike | None = None, + casting: np._CastingKind = "same_kind", ) -> NDArray[Any]: ... @overload def stack( arrays: Sequence[ArrayLike], - axis: SupportsIndex = ..., - out: _ArrayT = ..., + axis: SupportsIndex, + out: _ArrayT, + *, + dtype: DTypeLike | None = None, + casting: np._CastingKind = "same_kind", +) -> _ArrayT: ... +@overload +def stack( + arrays: Sequence[ArrayLike], + axis: SupportsIndex = 0, *, - dtype: DTypeLike = ..., - casting: np._CastingKind = ..., + out: _ArrayT, + dtype: DTypeLike | None = None, + casting: np._CastingKind = "same_kind", ) -> _ArrayT: ... # @overload -def unstack(array: _ArrayLike[_SCT], /, *, axis: int = ...) -> tuple[NDArray[_SCT], ...]: ... +def unstack(array: _ArrayLike[_SCT], /, *, axis: SupportsIndex = 0) -> tuple[NDArray[_SCT], ...]: ... @overload -def unstack(array: ArrayLike, /, *, axis: int = ...) -> tuple[NDArray[Any], ...]: ... +def unstack(array: ArrayLike, /, *, axis: SupportsIndex = 0) -> tuple[NDArray[Any], ...]: ... # @overload diff --git a/test/static/accept/array_constructors.pyi b/test/static/accept/array_constructors.pyi index 89035a0d..126fbcc4 100644 --- a/test/static/accept/array_constructors.pyi +++ b/test/static/accept/array_constructors.pyi @@ -9,19 +9,19 @@ import numpy.typing as npt _SCT_co = TypeVar("_SCT_co", bound=np.generic, covariant=True) -class SubClass(npt.NDArray[_SCT_co]): ... +class MyArray(npt.NDArray[_SCT_co]): ... i8: np.int64 A: npt.NDArray[np.float64] -B: SubClass[np.float64] +B: MyArray[np.float64] C: list[int] -D: SubClass[np.float64 | np.int64] +D: MyArray[np.float64 | np.int64] -def func(i: int, j: int, **kwargs: Any) -> SubClass[np.float64]: ... +def func(i: int, j: int, **kwargs: object) -> MyArray[np.float64]: ... assert_type(np.empty_like(A), npt.NDArray[np.float64]) -assert_type(np.empty_like(B), SubClass[np.float64]) +assert_type(np.empty_like(B), MyArray[np.float64]) assert_type(np.empty_like([1, 1.0]), npt.NDArray[Any]) assert_type(np.empty_like(A, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.empty_like(A, dtype="c16"), npt.NDArray[Any]) @@ -34,9 +34,9 @@ assert_type(np.array(A, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.array(A, dtype="c16"), npt.NDArray[Any]) assert_type(np.array(A, like=A), npt.NDArray[np.float64]) assert_type(np.array(A, subok=True), npt.NDArray[np.float64]) -assert_type(np.array(B, subok=True), SubClass[np.float64]) -assert_type(np.array(B, subok=True, ndmin=0), SubClass[np.float64]) -assert_type(np.array(B, subok=True, ndmin=1), SubClass[np.float64]) +assert_type(np.array(B, subok=True), MyArray[np.float64]) +assert_type(np.array(B, subok=True, ndmin=0), MyArray[np.float64]) +assert_type(np.array(B, subok=True, ndmin=1), MyArray[np.float64]) assert_type(np.array(D), npt.NDArray[np.float64 | np.int64]) assert_type(np.zeros([1, 5, 6]), npt.NDArray[np.float64]) @@ -65,7 +65,7 @@ assert_type(np.asarray(A, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.asarray(A, dtype="c16"), npt.NDArray[Any]) assert_type(np.asanyarray(A), npt.NDArray[np.float64]) -assert_type(np.asanyarray(B), SubClass[np.float64]) +assert_type(np.asanyarray(B), MyArray[np.float64]) assert_type(np.asanyarray([1, 1.0]), npt.NDArray[Any]) assert_type(np.asanyarray(A, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.asanyarray(A, dtype="c16"), npt.NDArray[Any]) @@ -104,11 +104,11 @@ assert_type(np.frombuffer(A), npt.NDArray[np.float64]) assert_type(np.frombuffer(A, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.frombuffer(A, dtype="c16"), npt.NDArray[Any]) -assert_type(np.arange(False, True), np.ndarray[tuple[int], np.dtype[np.signedinteger[Any]]]) -assert_type(np.arange(10), np.ndarray[tuple[int], np.dtype[np.signedinteger[Any]]]) -assert_type(np.arange(0, 10, step=2), np.ndarray[tuple[int], np.dtype[np.signedinteger[Any]]]) -assert_type(np.arange(10.0), np.ndarray[tuple[int], np.dtype[np.floating[Any]]]) -assert_type(np.arange(start=0, stop=10.0), np.ndarray[tuple[int], np.dtype[np.floating[Any]]]) +assert_type(np.arange(False, True), np.ndarray[tuple[int], np.dtype[np.signedinteger]]) +assert_type(np.arange(10), np.ndarray[tuple[int], np.dtype[np.signedinteger]]) +assert_type(np.arange(0, 10, step=2), np.ndarray[tuple[int], np.dtype[np.signedinteger]]) +assert_type(np.arange(10.0), np.ndarray[tuple[int], np.dtype[np.floating]]) +assert_type(np.arange(start=0, stop=10.0), np.ndarray[tuple[int], np.dtype[np.floating]]) assert_type(np.arange(np.timedelta64(0)), np.ndarray[tuple[int], np.dtype[np.timedelta64]]) assert_type(np.arange(0, np.timedelta64(10)), np.ndarray[tuple[int], np.dtype[np.timedelta64]]) assert_type(np.arange(np.datetime64("0"), np.datetime64("10")), np.ndarray[tuple[int], np.dtype[np.datetime64]]) @@ -118,52 +118,52 @@ assert_type(np.arange(10, dtype=int), np.ndarray[tuple[int], np.dtype[Any]]) assert_type(np.arange(0, 10, dtype="f8"), np.ndarray[tuple[int], np.dtype[Any]]) assert_type(np.require(A), npt.NDArray[np.float64]) -assert_type(np.require(B), SubClass[np.float64]) -assert_type(np.require(B, requirements=None), SubClass[np.float64]) +assert_type(np.require(B), MyArray[np.float64]) +assert_type(np.require(B, requirements=None), MyArray[np.float64]) assert_type(np.require(B, dtype=int), npt.NDArray[Any]) assert_type(np.require(B, requirements="E"), npt.NDArray[Any]) assert_type(np.require(B, requirements=["ENSUREARRAY"]), npt.NDArray[Any]) assert_type(np.require(B, requirements={"F", "E"}), npt.NDArray[Any]) -assert_type(np.require(B, requirements=["C", "OWNDATA"]), SubClass[np.float64]) -assert_type(np.require(B, requirements="W"), SubClass[np.float64]) -assert_type(np.require(B, requirements="A"), SubClass[np.float64]) +assert_type(np.require(B, requirements=["C", "OWNDATA"]), MyArray[np.float64]) +assert_type(np.require(B, requirements="W"), MyArray[np.float64]) +assert_type(np.require(B, requirements="A"), MyArray[np.float64]) assert_type(np.require(C), npt.NDArray[Any]) -assert_type(np.linspace(0, 10), npt.NDArray[np.floating[Any]]) -assert_type(np.linspace(0, 10j), npt.NDArray[np.complexfloating[Any, Any]]) +assert_type(np.linspace(0, 10), npt.NDArray[np.floating]) +assert_type(np.linspace(0, 10j), npt.NDArray[np.complexfloating]) assert_type(np.linspace(0, 10, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.linspace(0, 10, dtype=int), npt.NDArray[Any]) -assert_type(np.linspace(0, 10, retstep=True), tuple[npt.NDArray[np.floating[Any]], np.floating[Any]]) -assert_type(np.linspace(0j, 10, retstep=True), tuple[npt.NDArray[np.complexfloating[Any, Any]], np.complexfloating[Any, Any]]) +assert_type(np.linspace(0, 10, retstep=True), tuple[npt.NDArray[np.floating], np.floating]) +assert_type(np.linspace(0j, 10, retstep=True), tuple[npt.NDArray[np.complexfloating], np.complexfloating]) assert_type(np.linspace(0, 10, retstep=True, dtype=np.int64), tuple[npt.NDArray[np.int64], np.int64]) assert_type(np.linspace(0j, 10, retstep=True, dtype=int), tuple[npt.NDArray[Any], Any]) -assert_type(np.logspace(0, 10), npt.NDArray[np.floating[Any]]) -assert_type(np.logspace(0, 10j), npt.NDArray[np.complexfloating[Any, Any]]) +assert_type(np.logspace(0, 10), npt.NDArray[np.floating]) +assert_type(np.logspace(0, 10j), npt.NDArray[np.complexfloating]) assert_type(np.logspace(0, 10, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.logspace(0, 10, dtype=int), npt.NDArray[Any]) -assert_type(np.geomspace(0, 10), npt.NDArray[np.floating[Any]]) -assert_type(np.geomspace(0, 10j), npt.NDArray[np.complexfloating[Any, Any]]) +assert_type(np.geomspace(0, 10), npt.NDArray[np.floating]) +assert_type(np.geomspace(0, 10j), npt.NDArray[np.complexfloating]) assert_type(np.geomspace(0, 10, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.geomspace(0, 10, dtype=int), npt.NDArray[Any]) assert_type(np.zeros_like(A), npt.NDArray[np.float64]) assert_type(np.zeros_like(C), npt.NDArray[Any]) assert_type(np.zeros_like(A, dtype=float), npt.NDArray[Any]) -assert_type(np.zeros_like(B), SubClass[np.float64]) +assert_type(np.zeros_like(B), MyArray[np.float64]) assert_type(np.zeros_like(B, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.ones_like(A), npt.NDArray[np.float64]) assert_type(np.ones_like(C), npt.NDArray[Any]) assert_type(np.ones_like(A, dtype=float), npt.NDArray[Any]) -assert_type(np.ones_like(B), SubClass[np.float64]) +assert_type(np.ones_like(B), MyArray[np.float64]) assert_type(np.ones_like(B, dtype=np.int64), npt.NDArray[np.int64]) assert_type(np.full_like(A, i8), npt.NDArray[np.float64]) assert_type(np.full_like(C, i8), npt.NDArray[Any]) assert_type(np.full_like(A, i8, dtype=int), npt.NDArray[Any]) -assert_type(np.full_like(B, i8), SubClass[np.float64]) +assert_type(np.full_like(B, i8), MyArray[np.float64]) assert_type(np.full_like(B, i8, dtype=np.int64), npt.NDArray[np.int64]) _size: int @@ -194,7 +194,7 @@ assert_type(np.full(_shape_0d, i8, dtype=object), np.ndarray[tuple[()], np.dtype assert_type(np.indices([1, 2, 3]), npt.NDArray[np.int_]) assert_type(np.indices([1, 2, 3], sparse=True), tuple[npt.NDArray[np.int_], ...]) -assert_type(np.fromfunction(func, (3, 5)), SubClass[np.float64]) +assert_type(np.fromfunction(func, (3, 5)), MyArray[np.float64]) assert_type(np.identity(10), npt.NDArray[np.float64]) assert_type(np.identity(10, dtype=np.int64), npt.NDArray[np.int64]) @@ -202,30 +202,34 @@ assert_type(np.identity(10, dtype=int), npt.NDArray[Any]) assert_type(np.atleast_1d(A), npt.NDArray[np.float64]) assert_type(np.atleast_1d(C), npt.NDArray[Any]) -assert_type(np.atleast_1d(A, A), tuple[npt.NDArray[Any], ...]) -assert_type(np.atleast_1d(A, C), tuple[npt.NDArray[Any], ...]) -assert_type(np.atleast_1d(C, C), tuple[npt.NDArray[Any], ...]) +assert_type(np.atleast_1d(A, A), tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]) +assert_type(np.atleast_1d(A, C), tuple[npt.NDArray[Any], npt.NDArray[Any]]) +assert_type(np.atleast_1d(C, C), tuple[npt.NDArray[Any], npt.NDArray[Any]]) +assert_type(np.atleast_1d(A, A, A), tuple[npt.NDArray[np.float64], ...]) +assert_type(np.atleast_1d(C, C, C), tuple[npt.NDArray[Any], ...]) assert_type(np.atleast_2d(A), npt.NDArray[np.float64]) -assert_type(np.atleast_2d(A, A), tuple[npt.NDArray[Any], ...]) +assert_type(np.atleast_2d(A, A), tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]) +assert_type(np.atleast_2d(A, A, A), tuple[npt.NDArray[np.float64], ...]) assert_type(np.atleast_3d(A), npt.NDArray[np.float64]) -assert_type(np.atleast_3d(A, A), tuple[npt.NDArray[Any], ...]) +assert_type(np.atleast_3d(A, A), tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]) +assert_type(np.atleast_3d(A, A, A), tuple[npt.NDArray[np.float64], ...]) assert_type(np.vstack([A, A]), npt.NDArray[np.float64]) -assert_type(np.vstack([A, A], dtype=np.float64), npt.NDArray[np.float64]) +assert_type(np.vstack([A, A], dtype=np.float32), npt.NDArray[np.float32]) assert_type(np.vstack([A, C]), npt.NDArray[Any]) assert_type(np.vstack([C, C]), npt.NDArray[Any]) assert_type(np.hstack([A, A]), npt.NDArray[np.float64]) -assert_type(np.hstack([A, A], dtype=np.float64), npt.NDArray[np.float64]) +assert_type(np.hstack([A, A], dtype=np.float32), npt.NDArray[np.float32]) assert_type(np.stack([A, A]), npt.NDArray[np.float64]) -assert_type(np.stack([A, A], dtype=np.float64), npt.NDArray[np.float64]) +assert_type(np.stack([A, A], dtype=np.float32), npt.NDArray[np.float32]) assert_type(np.stack([A, C]), npt.NDArray[Any]) assert_type(np.stack([C, C]), npt.NDArray[Any]) assert_type(np.stack([A, A], axis=0), npt.NDArray[np.float64]) -assert_type(np.stack([A, A], out=B), SubClass[np.float64]) +assert_type(np.stack([A, A], out=B), MyArray[np.float64]) assert_type(np.block([[A, A], [A, A]]), npt.NDArray[Any]) # pyright: ignore[reportAssertTypeFailure] # npt.NDArray[np.float64] assert_type(np.block(C), npt.NDArray[Any])