From f4159f07b77097fa172abb7c0d1ee8df8cfe71cc Mon Sep 17 00:00:00 2001 From: jorenham Date: Tue, 30 Dec 2025 17:01:21 +0100 Subject: [PATCH 01/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.core`=20sync?= =?UTF-8?q?=20masked=20ufunc=20classes=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 119 ++++++++++++++++++++++++++---------- 1 file changed, 88 insertions(+), 31 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 26c486b9..3042e8b8 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -4,10 +4,12 @@ from collections.abc import Callable, Sequence from typing import ( Any, ClassVar, + Concatenate, Final, Generic, Literal as L, Never, + ParamSpec, Protocol, Self, SupportsIndex as CanIndex, @@ -214,10 +216,14 @@ __all__ = [ "zeros_like", ] +_T = TypeVar("_T") +_Tss = ParamSpec("_Tss") _ArrayT = TypeVar("_ArrayT", bound=np.ndarray[Any, Any]) _ArrayT_co = TypeVar("_ArrayT_co", bound=np.ndarray[Any, Any], covariant=True) _MArrayT = TypeVar("_MArrayT", bound=MaskedArray[Any, Any]) -_UFuncT_co = TypeVar("_UFuncT_co", bound=np.ufunc, default=np.ufunc, covariant=True) +# the additional `Callable[...]` bound simplifies self-binding to the ufunc's callable signature +_UFuncT_co = TypeVar("_UFuncT_co", bound=np.ufunc | Callable[..., object], default=np.ufunc, covariant=True) + _ScalarT = TypeVar("_ScalarT", bound=np.generic) _DTypeT = TypeVar("_DTypeT", bound=np.dtype) _DTypeT_co = TypeVar("_DTypeT_co", bound=np.dtype, default=np.dtype, covariant=True) @@ -236,6 +242,9 @@ _ShapeLike1D: TypeAlias = CanIndex | tuple[CanIndex] _ShapeLike2D: TypeAlias = tuple[CanIndex, CanIndex] _ShapeLike3D: TypeAlias = tuple[CanIndex, CanIndex, CanIndex] +_FillValueCallable: TypeAlias = Callable[[np.dtype | ArrayLike], complex | None] +_DomainCallable: TypeAlias = Callable[..., _nt.Array[np.bool]] + _Device: TypeAlias = L["cpu"] @type_check_only @@ -295,49 +304,97 @@ class _DomainSafeDivide: ### +# not generic at runtime class _MaskedUFunc(Generic[_UFuncT_co]): - f: _UFuncT_co - __name__: str - __qualname__: str + f: _UFuncT_co # readonly def __init__(self, /, ufunc: _UFuncT_co) -> None: ... +# not generic at runtime class _MaskedUnaryOperation(_MaskedUFunc[_UFuncT_co], Generic[_UFuncT_co]): - __doc__: str - domain: _DomainBase - fill: Incomplete - def __init__(self, /, mufunc: _UFuncT_co, fill: Incomplete = 0, domain: _DomainBase | None = None) -> None: ... - def __call__(self, /, a: Incomplete, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... + fill: Final[complex | None] + domain: Final[_DomainCallable | None] + + def __init__( + self, /, mufunc: _UFuncT_co, fill: complex | None = 0, domain: _DomainCallable | None = None + ) -> None: ... + # NOTE: This might not work with overloaded callable signatures might not work on + # pyright, which is a long-standing issue, and is unique to pyright: + # https://github.com/microsoft/pyright/issues/9663 + # https://github.com/microsoft/pyright/issues/10849 + # https://github.com/microsoft/pyright/issues/10899 + # https://github.com/microsoft/pyright/issues/11049 + def __call__( + self: _MaskedUnaryOperation[Callable[Concatenate[Any, _Tss], _T]], + /, + a: ArrayLike, + *args: _Tss.args, + **kwargs: _Tss.kwargs, + ) -> _T: ... + +# not generic at runtime class _MaskedBinaryOperation(_MaskedUFunc[_UFuncT_co], Generic[_UFuncT_co]): - __doc__: str - fillx: Incomplete - filly: Incomplete - def __init__(self, mbfunc: _UFuncT_co, fillx: Incomplete = 0, filly: Incomplete = 0) -> None: ... - def __call__(self, /, a: Incomplete, b: Incomplete, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... + fillx: Final[complex | None] + filly: Final[complex | None] - # - def reduce(self, target: Incomplete, axis: Incomplete = ..., dtype: Incomplete = ...) -> Incomplete: ... - def outer(self, a: Incomplete, b: Incomplete) -> MaskedArray: ... - def accumulate(self, target: Incomplete, axis: Incomplete = ...) -> MaskedArray: ... + def __init__(self, /, mbfunc: _UFuncT_co, fillx: complex | None = 0, filly: complex | None = 0) -> None: ... + # NOTE: See the comment in `_MaskedUnaryOperation.__call__` + def __call__( + self: _MaskedBinaryOperation[Callable[Concatenate[Any, Any, _Tss], _T]], + /, + a: ArrayLike, + b: ArrayLike, + *args: _Tss.args, + **kwargs: _Tss.kwargs, + ) -> _T: ... + + # NOTE: We cannot meaningfully annotate the return (d)types of these methods until + # the signatures of the corresponding `numpy.ufunc` methods are specified. + def reduce(self, /, target: ArrayLike, axis: CanIndex = 0, dtype: DTypeLike | None = None) -> Incomplete: ... + def outer(self, /, a: ArrayLike, b: ArrayLike) -> _nt.MArray[Incomplete]: ... + def accumulate(self, /, target: ArrayLike, axis: CanIndex = 0) -> _nt.MArray[Incomplete]: ... + +# not generic at runtime class _DomainedBinaryOperation(_MaskedUFunc[_UFuncT_co], Generic[_UFuncT_co]): - __doc__: str - domain: _DomainBase - fillx: Incomplete - filly: Incomplete + domain: Final[_DomainCallable] + fillx: Final[complex | None] + filly: Final[complex | None] + def __init__( - self, /, dbfunc: _UFuncT_co, domain: _DomainBase, fillx: Incomplete = 0, filly: Incomplete = 0 + self, /, dbfunc: _UFuncT_co, domain: _DomainCallable, fillx: complex | None = 0, filly: complex | None = 0 ) -> None: ... - def __call__(self, /, a: Incomplete, b: Incomplete, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... + # NOTE: See the comment in `_MaskedUnaryOperation.__call__` + def __call__( + self: _DomainedBinaryOperation[Callable[Concatenate[Any, Any, _Tss], _T]], + /, + a: ArrayLike, + b: ArrayLike, + *args: _Tss.args, + **kwargs: _Tss.kwargs, + ) -> _T: ... + +# not generic at runtime class _extrema_operation(_MaskedUFunc[_UFuncT_co], Generic[_UFuncT_co]): - __doc__: str - compare: Incomplete - fill_value_func: Incomplete - def __init__(self, ufunc: _UFuncT_co, compare: Incomplete, fill_value: Incomplete) -> None: ... - def __call__(self, /, a: Incomplete, b: Incomplete) -> Incomplete: ... - def reduce(self, /, target: Incomplete, axis: Incomplete = ...) -> Incomplete: ... - def outer(self, /, a: Incomplete, b: Incomplete) -> MaskedArray: ... + compare: Final[_MaskedBinaryOperation] + fill_value_func: Final[_FillValueCallable] + + def __init__( + self, /, ufunc: _UFuncT_co, compare: _MaskedBinaryOperation, fill_value: _FillValueCallable + ) -> None: ... + + # NOTE: This class is only used internally for `maximum` and `minimum`, so we are + # able to annotate the `__call__` method specifically for those two functions. + @overload + def __call__(self, /, a: _ArrayLike[_ScalarT], b: _ArrayLike[_ScalarT]) -> _nt.MArray[_ScalarT]: ... + @overload + def __call__(self, /, a: ArrayLike, b: ArrayLike) -> _nt.MArray[Incomplete]: ... + + # NOTE: We cannot meaningfully annotate the return (d)types of these methods until + # the signatures of the corresponding `numpy.ufunc` methods are specified. + def reduce(self, /, target: ArrayLike, axis: CanIndex | _NoValueType = ...) -> Incomplete: ... + def outer(self, /, a: ArrayLike, b: ArrayLike) -> _nt.MArray[Incomplete]: ... ### From a031aad686490f392a9215e7a4293bbb9607c174 Mon Sep 17 00:00:00 2001 From: jorenham Date: Tue, 30 Dec 2025 17:01:52 +0100 Subject: [PATCH 02/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.core.=5FMaske?= =?UTF-8?q?dPrintOption`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 3042e8b8..4cbf2702 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -15,6 +15,7 @@ from typing import ( SupportsIndex as CanIndex, TypeAlias, TypedDict, + final, overload, type_check_only, ) @@ -398,12 +399,15 @@ class _extrema_operation(_MaskedUFunc[_UFuncT_co], Generic[_UFuncT_co]): ### +@final class _MaskedPrintOption: - def __init__(self, /, display: Incomplete) -> None: ... - def display(self) -> Incomplete: ... - def set_display(self, /, s: Incomplete) -> None: ... - def enabled(self) -> bool: ... - def enable(self, /, shrink: Incomplete = 1) -> None: ... + _display: str + _enabled: bool | L[0, 1] + def __init__(self, /, display: str) -> None: ... + def display(self, /) -> str: ... + def set_display(self, /, s: str) -> None: ... + def enabled(self, /) -> bool: ... + def enable(self, /, shrink: bool | L[0, 1] = 1) -> None: ... class MaskedIterator: ma: Incomplete From 59c21f6a18edd74e9526de6ff8e868e658707d92 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 11:41:39 +0100 Subject: [PATCH 03/55] =?UTF-8?q?=F0=9F=A9=B9=20`flatiter`=20fix=20uppoer?= =?UTF-8?q?=20generic=20type=20parameter=20bound?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/_core/_multiarray_umath.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/_core/_multiarray_umath.pyi b/src/numpy-stubs/_core/_multiarray_umath.pyi index f5e59728..e4393138 100644 --- a/src/numpy-stubs/_core/_multiarray_umath.pyi +++ b/src/numpy-stubs/_core/_multiarray_umath.pyi @@ -62,8 +62,8 @@ _ScalarT = TypeVar("_ScalarT", bound=np.generic) _NumericT = TypeVar("_NumericT", bound=_nt.co_complex | np.timedelta64 | np.object_) _SafeScalarT = TypeVar("_SafeScalarT", bound=_nt.co_complex | np.timedelta64 | np.datetime64 | np.flexible) -_ArrayT = TypeVar("_ArrayT", bound=_nt.Array) -_ArrayT_co = TypeVar("_ArrayT_co", bound=_nt.Array, default=_nt.Array, covariant=True) +_ArrayT = TypeVar("_ArrayT", bound=np.ndarray[Any, Any]) +_ArrayT_co = TypeVar("_ArrayT_co", bound=np.ndarray[Any, Any], default=_nt.Array, covariant=True) _Array1T = TypeVar("_Array1T", bound=_nt.Array[Any, _nt.Shape1N]) _Array2T = TypeVar("_Array2T", bound=_nt.Array[Any, _nt.Shape2N]) From 973c48e328589665fd1db52646edd0f4d0ce35d2 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 11:45:37 +0100 Subject: [PATCH 04/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.core.MaskedIt?= =?UTF-8?q?erator`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 92 ++++++++++++++++++++++++++++++++----- 1 file changed, 80 insertions(+), 12 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 4cbf2702..7229757f 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1,5 +1,6 @@ +import datetime as dt import types -from _typeshed import Incomplete +from _typeshed import ConvertibleToFloat, ConvertibleToInt, Incomplete from collections.abc import Callable, Sequence from typing import ( Any, @@ -12,18 +13,20 @@ from typing import ( ParamSpec, Protocol, Self, + SupportsComplex, SupportsIndex as CanIndex, TypeAlias, TypedDict, + Unpack, final, overload, type_check_only, ) -from typing_extensions import Buffer, TypeVar, Unpack, override +from typing_extensions import Buffer, TypeVar, override import _numtype as _nt import numpy as np -from numpy import _OrderACF, _OrderKACF, amax, amin, bool_, expand_dims # noqa: ICN003 +from numpy import _OrderACF, _OrderKACF, _ToIndices, amax, amin, bool_, expand_dims # noqa: ICN003 from numpy._globals import _NoValueType from numpy._typing import ( ArrayLike, @@ -246,6 +249,10 @@ _ShapeLike3D: TypeAlias = tuple[CanIndex, CanIndex, CanIndex] _FillValueCallable: TypeAlias = Callable[[np.dtype | ArrayLike], complex | None] _DomainCallable: TypeAlias = Callable[..., _nt.Array[np.bool]] +_ConvertibleToComplex: TypeAlias = SupportsComplex | ConvertibleToFloat +_ConvertibleToTD64: TypeAlias = dt.timedelta | np.timedelta64 | int | _nt.co_complex | str | bytes | np.character +_ConvertibleToDT64: TypeAlias = dt.date | np.datetime64 | int | _nt.co_complex | str | bytes | np.character + _Device: TypeAlias = L["cpu"] @type_check_only @@ -409,15 +416,76 @@ class _MaskedPrintOption: def enabled(self, /) -> bool: ... def enable(self, /, shrink: bool | L[0, 1] = 1) -> None: ... -class MaskedIterator: - ma: Incomplete - dataiter: Incomplete - maskiter: Incomplete - def __init__(self, /, ma: Incomplete) -> None: ... - def __iter__(self) -> Incomplete: ... - def __getitem__(self, indx: Incomplete, /) -> Incomplete: ... - def __setitem__(self, index: Incomplete, value: Incomplete, /) -> None: ... - def __next__(self) -> Incomplete: ... +# TODO: Support non-boolean mask dtypes, such as `np.void`. This will require adding an +# additional generic type parameter to (at least) `MaskedArray` and `MaskedIterator` to +# hold the np.dtype of the mask. + +class MaskedIterator(Generic[_ShapeT_co, _DTypeT_co]): + ma: MaskedArray[_ShapeT_co, _DTypeT_co] # readonly + dataiter: np.flatiter[np.ndarray[_ShapeT_co, _DTypeT_co]] # readonly + maskiter: Final[np.flatiter[_nt.Array[np.bool]]] + + def __init__(self, ma: MaskedArray[_ShapeT_co, _DTypeT_co]) -> None: ... + def __iter__(self) -> Self: ... + + # Similar to `MaskedArray.__getitem__` but without the `void` case. + @overload + def __getitem__( + self, indx: _nt.Array[np.integer | np.bool] | tuple[_nt.Array[np.integer | np.bool], ...], / + ) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + @overload + def __getitem__(self, indx: CanIndex | tuple[CanIndex, ...], /) -> Incomplete: ... + @overload + def __getitem__(self, indx: _ToIndices, /) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + + # Similar to `ndarray.__setitem__` but without the `void` case. + @overload # flexible | object_ | bool + def __setitem__( + self: MaskedIterator[Any, np.dtype[np.flexible | np.object_ | np.bool] | np.dtypes.StringDType], + index: _ToIndices, + value: object, + /, + ) -> None: ... + @overload # integer + def __setitem__( + self: MaskedIterator[Any, np.dtype[np.integer]], + index: _ToIndices, + value: ConvertibleToInt | _nt.Sequence1ND[ConvertibleToInt] | _nt.CoInteger_nd, + /, + ) -> None: ... + @overload # floating + def __setitem__( + self: MaskedIterator[Any, np.dtype[np.floating]], + index: _ToIndices, + value: ConvertibleToFloat | _nt.Sequence1ND[ConvertibleToFloat | None] | _nt.CoFloating_nd | None, + /, + ) -> None: ... + @overload # complexfloating + def __setitem__( + self: MaskedIterator[Any, np.dtype[np.complexfloating]], + index: _ToIndices, + value: _ConvertibleToComplex | _nt.Sequence1ND[_ConvertibleToComplex | None] | _nt.CoComplex_nd | None, + /, + ) -> None: ... + @overload # timedelta64 + def __setitem__( + self: MaskedIterator[Any, np.dtype[np.timedelta64]], + index: _ToIndices, + value: _ConvertibleToTD64 | _nt.Sequence1ND[_ConvertibleToTD64 | None] | None, + /, + ) -> None: ... + @overload # datetime64 + def __setitem__( + self: MaskedIterator[Any, np.dtype[np.datetime64]], + index: _ToIndices, + value: _ConvertibleToDT64 | _nt.Sequence1ND[_ConvertibleToDT64 | None] | None, + /, + ) -> None: ... + @overload # catch-all + def __setitem__(self, index: _ToIndices, value: ArrayLike, /) -> None: ... + + # TODO: Returns `mvoid[(), _DTypeT_co]` for masks with `np.void` np.dtype. + def __next__(self: MaskedIterator[Any, np.dtype[_ScalarT]]) -> _ScalarT: ... class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): __array_priority__: ClassVar[float] = 15 # pyright: ignore[reportIncompatibleMethodOverride] From 9976fd1267a1a87156d3f14b874128aa4702bd91 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 11:53:44 +0100 Subject: [PATCH 05/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.core.MaskedCo?= =?UTF-8?q?nstant`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 7229757f..964a5274 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -235,6 +235,8 @@ _ShapeT = TypeVar("_ShapeT", bound=_nt.Shape) # TODO: use `Shape` instead of `AnyShape` once python/mypy#19110 is fixed _ShapeT_co = TypeVar("_ShapeT_co", bound=_nt.AnyShape, default=_nt.Shape, covariant=True) +_Ignored: TypeAlias = object + _ToInt: TypeAlias = int | _nt.co_integer _ToTD64: TypeAlias = int | _nt.co_timedelta _ToFloat: TypeAlias = float | _nt.co_float @@ -854,38 +856,26 @@ class mvoid(MaskedArray[_ShapeT_co, _DTypeT_co]): def tolist(self) -> Incomplete: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # 0D float64 array -class MaskedConstant(MaskedArray[_nt.Rank0, np.dtype[np.float64]]): +class MaskedConstant(MaskedArray[tuple[()], np.dtype[np.float64]]): def __new__(cls) -> Self: ... - @override - def __array_wrap__( # type: ignore[override] - self, /, obj: Incomplete, context: Incomplete | None = None, return_scalar: bool = False - ) -> _nt.MArray0D[np.float64]: ... - @override - def __format__(self, format_spec: str, /) -> str: ... - # no-ops + # these overrides are no-ops @override - def __iadd__(self, other: object, /) -> Self: ... # type: ignore[override] + def __iadd__(self, other: _Ignored, /) -> Self: ... # type: ignore[override] @override - def __isub__(self, other: object, /) -> Self: ... # type: ignore[override] + def __isub__(self, other: _Ignored, /) -> Self: ... # type: ignore[override] @override - def __imul__(self, other: object, /) -> Self: ... # type: ignore[override] + def __imul__(self, other: _Ignored, /) -> Self: ... # type: ignore[override] @override - def __ifloordiv__(self, other: object, /) -> Self: ... # type: ignore[override] + def __ifloordiv__(self, other: _Ignored, /) -> Self: ... # type: ignore[override] @override - def __itruediv__(self, other: object, /) -> Self: ... # type: ignore[override] + def __itruediv__(self, other: _Ignored, /) -> Self: ... # type: ignore[override] @override - def __ipow__(self, other: object, /) -> Self: ... # type: ignore[override] - - # - @override - def __reduce__(self) -> tuple[type[Self], tuple[()]]: ... + def __ipow__(self, other: _Ignored, /) -> Self: ... # type: ignore[override] @override - def __copy__(self) -> Self: ... + def __deepcopy__(self, /, memo: _Ignored) -> Self: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] @override - def __deepcopy__(self, /, memo: object) -> Self: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - @override - def copy(self, /, *args: object, **kwargs: object) -> Incomplete: ... + def copy(self, /, *args: _Ignored, **kwargs: _Ignored) -> Self: ... # we cannot meaningfully annotate `frommethod` further, because the callable signature # of the return type fully depends on the *value* of `methodname` and `reversed` in @@ -1497,6 +1487,7 @@ def isMaskedArray(x: Incomplete) -> Incomplete: ... # masked: Final[MaskedConstant] = ... masked_singleton: Final[MaskedConstant] = ... + masked_array = MaskedArray # From 454680a41f034b2c6a9079a22deec17262577915 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:03:37 +0100 Subject: [PATCH 06/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.core.mvoid`?= =?UTF-8?q?=20sync=20with=20upstream=20(and=20then=20some)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 964a5274..4da063f9 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1,7 +1,7 @@ import datetime as dt import types from _typeshed import ConvertibleToFloat, ConvertibleToInt, Incomplete -from collections.abc import Callable, Sequence +from collections.abc import Callable, Iterator, Sequence from typing import ( Any, ClassVar, @@ -241,6 +241,8 @@ _ToInt: TypeAlias = int | _nt.co_integer _ToTD64: TypeAlias = int | _nt.co_timedelta _ToFloat: TypeAlias = float | _nt.co_float +_ToMask: TypeAlias = _nt.ToBool_nd + _ArangeScalar: TypeAlias = np.integer | np.floating | np.datetime64 | np.timedelta64 _ArangeScalarT = TypeVar("_ArangeScalarT", bound=_ArangeScalar) @@ -832,28 +834,28 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): class mvoid(MaskedArray[_ShapeT_co, _DTypeT_co]): def __new__( self, # noqa: PLW0211 - data: Incomplete, - mask: Incomplete = ..., - dtype: Incomplete = ..., - fill_value: Incomplete = ..., - hardmask: Incomplete = ..., - copy: bool = ..., - subok: bool = ..., + data: ArrayLike, + mask: _ToMask = ..., + dtype: DTypeLike | None = None, + fill_value: complex | None = None, + hardmask: bool = False, + copy: bool = False, + subok: bool = True, ) -> Self: ... @override - def __getitem__(self, indx: Incomplete, /) -> Incomplete: ... + def __getitem__(self, indx: _ToIndices, /) -> Incomplete: ... # type: ignore[override] @override - def __setitem__(self, indx: Incomplete, value: Incomplete, /) -> None: ... + def __setitem__(self, indx: _ToIndices, value: ArrayLike, /) -> None: ... # type: ignore[override] @override - def __iter__(self) -> Incomplete: ... + def __iter__(self: mvoid[Any, np.dtype[_ScalarT]], /) -> Iterator[MaskedConstant | _ScalarT]: ... # pyright: ignore[reportIncompatibleMethodOverride] @override - def __len__(self) -> int: ... + def __len__(self, /) -> int: ... # @override - def filled(self, fill_value: Incomplete = ...) -> Incomplete: ... - @override - def tolist(self) -> Incomplete: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + def filled(self, fill_value: complex | None = None) -> Self | np.void: ... + @override # list or tuple + def tolist(self) -> Sequence[Incomplete]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # 0D float64 array class MaskedConstant(MaskedArray[tuple[()], np.dtype[np.float64]]): From 957462c174f1f8447e5ba243ea03a60dc88b0996 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:06:53 +0100 Subject: [PATCH 07/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.?= =?UTF-8?q?=5F=5Fnew=5F=5F`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 80 +++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 4da063f9..dd3387d6 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -26,7 +26,7 @@ from typing_extensions import Buffer, TypeVar, override import _numtype as _nt import numpy as np -from numpy import _OrderACF, _OrderKACF, _ToIndices, amax, amin, bool_, expand_dims # noqa: ICN003 +from numpy import _OrderKACF, _ToIndices, amax, amin, bool_, expand_dims # noqa: ICN003 from numpy._globals import _NoValueType from numpy._typing import ( ArrayLike, @@ -494,6 +494,68 @@ class MaskedIterator(Generic[_ShapeT_co, _DTypeT_co]): class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): __array_priority__: ClassVar[float] = 15 # pyright: ignore[reportIncompatibleMethodOverride] + @overload + def __new__( + cls, + data: _ArrayLike[_ScalarT], + mask: _ToMask = ..., + dtype: None = None, + copy: bool = False, + subok: bool = True, + ndmin: int = 0, + fill_value: _ScalarLike_co | None = None, + keep_mask: bool = True, + hard_mask: bool | None = None, + shrink: bool = True, + order: _OrderKACF | None = None, + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __new__( + cls, + data: object, + mask: _ToMask, + dtype: _DTypeLike[_ScalarT], + copy: bool = False, + subok: bool = True, + ndmin: int = 0, + fill_value: _ScalarLike_co | None = None, + keep_mask: bool = True, + hard_mask: bool | None = None, + shrink: bool = True, + order: _OrderKACF | None = None, + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __new__( + cls, + data: object, + mask: _ToMask = ..., + *, + dtype: _DTypeLike[_ScalarT], + copy: bool = False, + subok: bool = True, + ndmin: int = 0, + fill_value: _ScalarLike_co | None = None, + keep_mask: bool = True, + hard_mask: bool | None = None, + shrink: bool = True, + order: _OrderKACF | None = None, + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __new__( + cls, + data: object = None, + mask: _ToMask = ..., + dtype: DTypeLike | None = None, + copy: bool = False, + subok: bool = True, + ndmin: int = 0, + fill_value: _ScalarLike_co | None = None, + keep_mask: bool = True, + hard_mask: bool | None = None, + shrink: bool = True, + order: _OrderKACF | None = None, + ) -> _nt.MArray[Any]: ... + # @property def mask(self) -> Incomplete: ... @@ -554,22 +616,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def T(self) -> Self: ... - # - def __new__( - cls, - data: Incomplete | None = None, - mask: Incomplete = ..., - dtype: Incomplete = None, - copy: bool = False, - subok: bool = True, - ndmin: int = 0, - fill_value: Incomplete = None, - keep_mask: bool = True, - hard_mask: bool | None = None, - shrink: bool = True, - order: _OrderACF | None = None, - ) -> Self: ... - # @override def __array_finalize__(self, /, obj: Incomplete) -> None: ... From 54a38e80c3c19726c942fc3fc43886032172387a Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:07:40 +0100 Subject: [PATCH 08/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.?= =?UTF-8?q?=5F=5Farray=5Fwrap=5F=5F`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index dd3387d6..2093b302 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -556,6 +556,15 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): order: _OrderKACF | None = None, ) -> _nt.MArray[Any]: ... + # + @override + def __array_wrap__( + self, + obj: np.ndarray[_ShapeT, _DTypeT], + context: tuple[np.ufunc, tuple[Any, ...], int] | None = None, + return_scalar: bool = False, + ) -> MaskedArray[_ShapeT, _DTypeT]: ... + # @property def mask(self) -> Incomplete: ... @@ -619,10 +628,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override def __array_finalize__(self, /, obj: Incomplete) -> None: ... - @override - def __array_wrap__( - self, /, obj: Incomplete, context: Incomplete | None = None, return_scalar: bool = False - ) -> Incomplete: ... def __setmask__(self, /, mask: Incomplete, copy: bool = False) -> None: ... # From 558cea13742d4839c235690b366bd9f777c09828 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:11:34 +0100 Subject: [PATCH 09/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.v?= =?UTF-8?q?iew`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 38 +++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 2093b302..7e5c1b99 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -37,6 +37,7 @@ from numpy._typing import ( _ShapeLike, _SupportsArrayFunc as _CanArrayFunc, _SupportsDType as _HasDType, + _VoidDTypeLike, ) __all__ = [ @@ -565,6 +566,39 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): return_scalar: bool = False, ) -> MaskedArray[_ShapeT, _DTypeT]: ... + # + @override # type: ignore[override] + @overload # () + def view(self, /, dtype: None = None, type: None = None, fill_value: _ScalarLike_co | None = None) -> Self: ... + @overload # (dtype: DTypeT) + def view( + self, /, dtype: _DTypeT | _HasDType[_DTypeT], type: None = None, fill_value: _ScalarLike_co | None = None + ) -> MaskedArray[_ShapeT_co, _DTypeT]: ... + @overload # (dtype: dtype[ScalarT]) + def view( + self, /, dtype: _DTypeLike[_ScalarT], type: None = None, fill_value: _ScalarLike_co | None = None + ) -> MaskedArray[_ShapeT_co, np.dtype[_ScalarT]]: ... + @overload # ([dtype: _, ]*, type: ArrayT) + def view( + self, /, dtype: DTypeLike | None = None, *, type: type[_ArrayT], fill_value: _ScalarLike_co | None = None + ) -> _ArrayT: ... + @overload # (dtype: _, type: ArrayT) + def view( + self, /, dtype: DTypeLike | None, type: type[_ArrayT], fill_value: _ScalarLike_co | None = None + ) -> _ArrayT: ... + @overload # (dtype: ArrayT, /) + def view(self, /, dtype: type[_ArrayT], type: None = None, fill_value: _ScalarLike_co | None = None) -> _ArrayT: ... + @overload # (dtype: ?) + def view( # pyright: ignore[reportIncompatibleMethodOverride] + self, + /, + # `_VoidDTypeLike | str | None` is like `DTypeLike` but without `_DTypeLike[Any]` to avoid + # overlaps with previous overloads. + dtype: _VoidDTypeLike | str | None, + type: None = None, + fill_value: _ScalarLike_co | None = None, + ) -> MaskedArray[_ShapeT_co, np.dtype]: ... + # @property def mask(self) -> Incomplete: ... @@ -693,10 +727,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... # - @override - def view( # pyright: ignore[reportIncompatibleMethodOverride] - self, /, dtype: Incomplete = None, type: Incomplete = None, fill_value: Incomplete = None - ) -> Incomplete: ... def harden_mask(self) -> Incomplete: ... def soften_mask(self) -> Incomplete: ... def unshare_mask(self) -> Incomplete: ... From 9d0068189ffe9e1b517f04c055e46b2f484897ac Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:14:16 +0100 Subject: [PATCH 10/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.?= =?UTF-8?q?=5F=5Fgetitem=5F=5F`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 7e5c1b99..54248370 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -599,6 +599,21 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): fill_value: _ScalarLike_co | None = None, ) -> MaskedArray[_ShapeT_co, np.dtype]: ... + # Keep in sync with `ndarray.__getitem__` + @override + @overload + def __getitem__( + self, key: _nt.Array[_nt.co_integer] | tuple[_nt.Array[_nt.co_integer], ...], / + ) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + @overload + def __getitem__(self, key: CanIndex | tuple[CanIndex, ...], /) -> Any: ... + @overload + def __getitem__(self, key: _ToIndices, /) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + @overload + def __getitem__(self: _nt.MArray[np.void], indx: str, /) -> MaskedArray[_ShapeT_co]: ... + @overload + def __getitem__(self: _nt.MArray[np.void], indx: list[str], /) -> MaskedArray[_ShapeT_co, np.dtype[np.void]]: ... + # @property def mask(self) -> Incomplete: ... @@ -664,12 +679,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __array_finalize__(self, /, obj: Incomplete) -> None: ... def __setmask__(self, /, mask: Incomplete, copy: bool = False) -> None: ... - # - @override - def __getitem__(self, indx: Incomplete, /) -> Incomplete: ... - @override - def __setitem__(self, indx: Incomplete, value: Incomplete, /) -> None: ... - # @override def __eq__(self, other: Incomplete, /) -> Incomplete: ... @@ -923,10 +932,14 @@ class mvoid(MaskedArray[_ShapeT_co, _DTypeT_co]): copy: bool = False, subok: bool = True, ) -> Self: ... + + # @override - def __getitem__(self, indx: _ToIndices, /) -> Incomplete: ... # type: ignore[override] + def __getitem__(self, indx: _ToIndices, /) -> Incomplete: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] @override - def __setitem__(self, indx: _ToIndices, value: ArrayLike, /) -> None: ... # type: ignore[override] + def __setitem__(self, indx: _ToIndices, value: ArrayLike, /) -> None: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + + # @override def __iter__(self: mvoid[Any, np.dtype[_ScalarT]], /) -> Iterator[MaskedConstant | _ScalarT]: ... # pyright: ignore[reportIncompatibleMethodOverride] @override From 64721c2f49836b94f20b2f1dfabf85006f720117 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:17:45 +0100 Subject: [PATCH 11/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray`?= =?UTF-8?q?=20sync=20mask-specific=20methods=20and=20properties=20with=20u?= =?UTF-8?q?pstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 54248370..9831b5ce 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -615,22 +615,25 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __getitem__(self: _nt.MArray[np.void], indx: list[str], /) -> MaskedArray[_ShapeT_co, np.dtype[np.void]]: ... # + def __setmask__(self, mask: _ToMask, copy: bool = False) -> None: ... @property - def mask(self) -> Incomplete: ... + def mask(self) -> np.ndarray[_ShapeT_co, np.dtype[np.bool_]] | np.bool_: ... @mask.setter - def mask(self, value: Incomplete, /) -> None: ... - - # + def mask(self, value: _ToMask, /) -> None: ... @property - def recordmask(self) -> _nt.Array[np.bool_]: ... + def recordmask(self) -> np.ndarray[_ShapeT_co, np.dtype[np.bool_]] | np.bool_: ... @recordmask.setter - def recordmask(self, mask: Never, /) -> None: ... - - # + def recordmask(self, mask: Never, /) -> Never: ... + def harden_mask(self) -> Self: ... + def soften_mask(self) -> Self: ... @property - def hardmask(self) -> Incomplete: ... + def hardmask(self) -> bool: ... + def unshare_mask(self) -> Self: ... @property - def sharedmask(self) -> Incomplete: ... + def sharedmask(self) -> bool: ... + def shrink_mask(self) -> Self: ... + + # @property def baseclass(self) -> Incomplete: ... @@ -677,7 +680,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override def __array_finalize__(self, /, obj: Incomplete) -> None: ... - def __setmask__(self, /, mask: Incomplete, copy: bool = False) -> None: ... # @override @@ -736,10 +738,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... # - def harden_mask(self) -> Incomplete: ... - def soften_mask(self) -> Incomplete: ... - def unshare_mask(self) -> Incomplete: ... - def shrink_mask(self) -> Incomplete: ... def filled(self, /, fill_value: Incomplete = None) -> Incomplete: ... def compressed(self) -> Incomplete: ... @override From 904b9efb37ec58b31885e511bc245a0a368e1e2a Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:18:16 +0100 Subject: [PATCH 12/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.b?= =?UTF-8?q?aseclass`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 9831b5ce..9aa4ea1b 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -635,7 +635,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @property - def baseclass(self) -> Incomplete: ... + def baseclass(self) -> type[np.ndarray]: ... # @property # type: ignore[explicit-override] From b6b8cea8b52540d65ec07714a0e5a2c9141d33ad Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:19:20 +0100 Subject: [PATCH 13/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.d?= =?UTF-8?q?ata`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 9aa4ea1b..2aea8894 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -637,6 +637,13 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @property def baseclass(self) -> type[np.ndarray]: ... + # + @property + def _data(self) -> np.ndarray[_ShapeT_co, _DTypeT_co]: ... + @property + @override + def data(self) -> np.ndarray[_ShapeT_co, _DTypeT_co]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # @property # type: ignore[explicit-override] @override @@ -644,11 +651,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @flat.setter def flat(self, value: Incomplete) -> Incomplete: ... - # - @property - @override - def data(self) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - # def get_fill_value(self) -> Incomplete: ... def set_fill_value(self, /, value: Incomplete = None) -> Incomplete: ... From 28d9a6e3168f26d904b2b5f4a53c661beea921be Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:23:25 +0100 Subject: [PATCH 14/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.f?= =?UTF-8?q?lat`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 2aea8894..7b2b8336 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -644,12 +644,12 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def data(self) -> np.ndarray[_ShapeT_co, _DTypeT_co]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - # - @property # type: ignore[explicit-override] + # the `explicit-override` error is an obvious false positive from mypy + @property # type: ignore[explicit-override, override] @override - def flat(self) -> Incomplete: ... + def flat(self) -> MaskedIterator[_ShapeT_co, _DTypeT_co]: ... # pyright: ignore[reportIncompatibleMethodOverride] @flat.setter - def flat(self, value: Incomplete) -> Incomplete: ... + def flat(self, value: ArrayLike, /) -> None: ... # def get_fill_value(self) -> Incomplete: ... From ccf782cc2b6aa263de73222535a988061913a2af Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:24:16 +0100 Subject: [PATCH 15/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.*?= =?UTF-8?q?fill=5Fvalue`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 7b2b8336..0cd1295d 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -652,12 +652,12 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def flat(self, value: ArrayLike, /) -> None: ... # - def get_fill_value(self) -> Incomplete: ... - def set_fill_value(self, /, value: Incomplete = None) -> Incomplete: ... @property - def fill_value(self) -> Incomplete: ... + def fill_value(self: _nt.MArray[_ScalarT]) -> _ScalarT: ... @fill_value.setter - def fill_value(self, value: Incomplete = None, /) -> Incomplete: ... + def fill_value(self, value: _ScalarLike_co | None = None, /) -> None: ... + def get_fill_value(self: _nt.MArray[_ScalarT]) -> _ScalarT: ... + def set_fill_value(self, /, value: _ScalarLike_co | None = None) -> None: ... # @property # type: ignore[misc] From 89b669f09f56f55e4ea3b3d3e608e8cee6d4d4bf Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:26:18 +0100 Subject: [PATCH 16/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.f?= =?UTF-8?q?illed`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 0cd1295d..b15155fe 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -659,6 +659,9 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def get_fill_value(self: _nt.MArray[_ScalarT]) -> _ScalarT: ... def set_fill_value(self, /, value: _ScalarLike_co | None = None) -> None: ... + # + def filled(self, /, fill_value: _ScalarLike_co | None = None) -> np.ndarray[_ShapeT_co, _DTypeT_co]: ... + # @property # type: ignore[misc] @override @@ -740,7 +743,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... # - def filled(self, /, fill_value: Incomplete = None) -> Incomplete: ... def compressed(self) -> Incomplete: ... @override def compress(self, /, condition: Incomplete, axis: Incomplete = None, out: Incomplete = None) -> Incomplete: ... # pyright: ignore[reportIncompatibleMethodOverride] @@ -947,7 +949,7 @@ class mvoid(MaskedArray[_ShapeT_co, _DTypeT_co]): # @override - def filled(self, fill_value: complex | None = None) -> Self | np.void: ... + def filled(self, /, fill_value: _ScalarLike_co | None = None) -> Self | np.void: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] @override # list or tuple def tolist(self) -> Sequence[Incomplete]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] From 27823965148c1408f0e74fdf8af23032c4b4d414 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:27:16 +0100 Subject: [PATCH 17/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.c?= =?UTF-8?q?ompressed`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index b15155fe..ae5c5946 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -662,6 +662,9 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # def filled(self, /, fill_value: _ScalarLike_co | None = None) -> np.ndarray[_ShapeT_co, _DTypeT_co]: ... + # + def compressed(self) -> np.ndarray[_nt.Rank1, _DTypeT_co]: ... + # @property # type: ignore[misc] @override @@ -743,7 +746,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... # - def compressed(self) -> Incomplete: ... @override def compress(self, /, condition: Incomplete, axis: Incomplete = None, out: Incomplete = None) -> Incomplete: ... # pyright: ignore[reportIncompatibleMethodOverride] From 10f3b968b937e3ba8abc514f7b4c5c7e0a8c5d8c Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:29:14 +0100 Subject: [PATCH 18/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.c?= =?UTF-8?q?ompress`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index ae5c5946..7f098fee 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -665,6 +665,21 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # def compressed(self) -> np.ndarray[_nt.Rank1, _DTypeT_co]: ... + # keep roughly in sync with `ma.core.compress`, but swap the first two arguments + @override # type: ignore[override] + @overload + def compress(self, condition: _nt.ToBool_nd, axis: _ShapeLike | None, out: _ArrayT) -> _ArrayT: ... + @overload + def compress(self, condition: _nt.ToBool_nd, axis: _ShapeLike | None = None, *, out: _ArrayT) -> _ArrayT: ... + @overload + def compress( + self, condition: _nt.ToBool_nd, axis: None = None, out: None = None + ) -> MaskedArray[_nt.Rank1, _DTypeT_co]: ... + @overload + def compress( # pyright: ignore[reportIncompatibleMethodOverride] + self, condition: _nt.ToBool_nd, axis: _ShapeLike | None = None, out: None = None + ) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + # @property # type: ignore[misc] @override @@ -745,10 +760,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... - # - @override - def compress(self, /, condition: Incomplete, axis: Incomplete = None, out: Incomplete = None) -> Incomplete: ... # pyright: ignore[reportIncompatibleMethodOverride] - # def count(self, axis: Incomplete = None, keepdims: Incomplete = ...) -> Incomplete: ... @override From 788feda44002aaea4a93f9646a1d6e364e218220 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:31:21 +0100 Subject: [PATCH 19/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.?= =?UTF-8?q?=5F=5F{eq,ne,ge,gt,le,lt}=5F=5F`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 7f098fee..0792097e 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -680,6 +680,23 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): self, condition: _nt.ToBool_nd, axis: _ShapeLike | None = None, out: None = None ) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + # TODO: How to deal with the non-commutative nature of `==` and `!=`? + # xref numpy/numpy#17368 + @override + def __eq__(self, other: Incomplete, /) -> Incomplete: ... + @override + def __ne__(self, other: Incomplete, /) -> Incomplete: ... + + # + @override + def __ge__(self, other: ArrayLike, /) -> _nt.MArray[np.bool_]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + @override + def __gt__(self, other: ArrayLike, /) -> _nt.MArray[np.bool_]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + @override + def __le__(self, other: ArrayLike, /) -> _nt.MArray[np.bool_]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + @override + def __lt__(self, other: ArrayLike, /) -> _nt.MArray[np.bool_]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # @property # type: ignore[misc] @override @@ -706,18 +723,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override - def __eq__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __ne__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __ge__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __gt__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __le__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __lt__(self, other: Incomplete, /) -> Incomplete: ... - @override def __add__(self, other: Incomplete, /) -> Incomplete: ... @override def __radd__(self, other: Incomplete, /) -> Incomplete: ... From c742fbadc36c20cf8f3644695263636a2e48c989 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:37:41 +0100 Subject: [PATCH 20/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.?= =?UTF-8?q?=5F=5F*add=5F=5F`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 115 +++++++++++++++++++++++++++++++++--- 1 file changed, 108 insertions(+), 7 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 0792097e..0fdabe47 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -26,7 +26,18 @@ from typing_extensions import Buffer, TypeVar, override import _numtype as _nt import numpy as np -from numpy import _OrderKACF, _ToIndices, amax, amin, bool_, expand_dims # noqa: ICN003 +from numpy import ( # noqa: ICN003 + _AnyItemT, + _OrderKACF, + _PyComplexND, + _PyFloatND, + _PyIntND, + _ToIndices, + amax, + amin, + bool_, + expand_dims, +) from numpy._globals import _NoValueType from numpy._typing import ( ArrayLike, @@ -230,6 +241,7 @@ _MArrayT = TypeVar("_MArrayT", bound=MaskedArray[Any, Any]) _UFuncT_co = TypeVar("_UFuncT_co", bound=np.ufunc | Callable[..., object], default=np.ufunc, covariant=True) _ScalarT = TypeVar("_ScalarT", bound=np.generic) +_SelfScalarT = TypeVar("_SelfScalarT", bound=np.generic) _DTypeT = TypeVar("_DTypeT", bound=np.dtype) _DTypeT_co = TypeVar("_DTypeT_co", bound=np.dtype, default=np.dtype, covariant=True) _ShapeT = TypeVar("_ShapeT", bound=_nt.Shape) @@ -697,6 +709,101 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def __lt__(self, other: ArrayLike, /) -> _nt.MArray[np.bool_]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # + @override # type: ignore[override] + @overload + def __add__(self: _nt.Array[_ScalarT], x: _nt.Casts[_ScalarT], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __add__(self: _nt.Array[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __add__(self: _nt.CastsWithBuiltin[_T, _ScalarT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __add__(self: _nt.CastsWithInt[_ScalarT], x: _PyIntND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __add__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __add__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __add__(self: _nt.Array[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> _nt.MArray[np.datetime64]: ... + @overload + def __add__(self: _nt.Array[_nt.co_timedelta], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.datetime64]: ... # pyright: ignore[reportOverlappingOverload] + @overload + def __add__(self: _nt.Array[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] + @overload + def __add__( # pyright: ignore[reportOverlappingOverload] + self: _nt.Array[np.str_], x: _nt.ToString_nd[_T], / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType]: ... + @overload + def __add__( + self: _nt.StringArrayND[_T], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... + @overload + def __add__( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.Array[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRAdd[_AnyItemT]], / + ) -> _nt.MArray[Incomplete]: ... + + # + @override # type: ignore[override] + @overload + def __radd__(self: _nt.Array[_ScalarT], x: _nt.Casts[_ScalarT], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __radd__( + self: _nt.Array[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], / + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __radd__(self: _nt.CastsWithBuiltin[_T, _ScalarT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __radd__(self: _nt.CastsWithInt[_ScalarT], x: _PyIntND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __radd__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __radd__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __radd__(self: _nt.Array[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> _nt.MArray[np.datetime64]: ... + @overload + def __radd__(self: _nt.Array[_nt.co_timedelta], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.datetime64]: ... # pyright: ignore[reportOverlappingOverload] + @overload + def __radd__(self: _nt.Array[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] + @overload + def __radd__( # pyright: ignore[reportOverlappingOverload] + self: _nt.Array[np.str_], x: _nt.ToString_nd[_T], / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... + @overload + def __radd__( + self: _nt.StringArrayND[_T], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... + @overload + def __radd__( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.Array[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanAdd[_AnyItemT]], / + ) -> _nt.MArray[Incomplete]: ... + + # + @override # type: ignore[misc, override] + @overload + def __iadd__(self: _nt.Array[_ScalarT], x: _nt.Casts[_ScalarT], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__(self: _nt.Array[np.bool_], x: _nt.SequenceND[bool], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__(self: _nt.Array[np.number], x: _nt.SequenceND[int], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__(self: _nt.Array[np.inexact], x: _nt.SequenceND[float], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__( + self: _nt.Array[np.complexfloating], x: _nt.SequenceND[complex], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__(self: _nt.Array[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__(self: _nt.Array[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__( + self: _nt.StringArrayND[_T], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __iadd__( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.Array[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRAdd[_AnyItemT, _AnyItemT]], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + # @property # type: ignore[misc] @override @@ -723,10 +830,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override - def __add__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __radd__(self, other: Incomplete, /) -> Incomplete: ... - @override def __sub__(self, other: Incomplete, /) -> Incomplete: ... @override def __rsub__(self, other: Incomplete, /) -> Incomplete: ... @@ -747,8 +850,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def __rpow__(self, other: Incomplete, /) -> Incomplete: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] @override - def __iadd__(self, other: Incomplete, /) -> Self: ... # type: ignore[override] - @override def __isub__(self, other: Incomplete, /) -> Self: ... @override def __imul__(self, other: Incomplete, /) -> Self: ... # type: ignore[override] From 3aa1d51f2b57c3a4dd4b8920cd7d13bbf0193092 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 12:59:04 +0100 Subject: [PATCH 21/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.?= =?UTF-8?q?=5F=5F*{mul,pow,div}=5F=5F`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 489 +++++++++++++++++++++++++++++++----- 1 file changed, 432 insertions(+), 57 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 0fdabe47..e9883234 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -28,6 +28,7 @@ import _numtype as _nt import numpy as np from numpy import ( # noqa: ICN003 _AnyItemT, + _HasType, _OrderKACF, _PyComplexND, _PyFloatND, @@ -242,6 +243,15 @@ _UFuncT_co = TypeVar("_UFuncT_co", bound=np.ufunc | Callable[..., object], defau _ScalarT = TypeVar("_ScalarT", bound=np.generic) _SelfScalarT = TypeVar("_SelfScalarT", bound=np.generic) +_RealScalarT = TypeVar("_RealScalarT", bound=_nt.co_float | np.object_) +_RealNumberT = TypeVar("_RealNumberT", bound=np.integer | np.floating) +_InexactT = TypeVar("_InexactT", bound=np.inexact) +_NumberT = TypeVar("_NumberT", bound=np.number) +_NumericT = TypeVar("_NumericT", bound=np.number | np.timedelta64) +_CoNumberT = TypeVar("_CoNumberT", bound=_nt.co_complex) + +_AnyNumberItemT = TypeVar("_AnyNumberItemT", int, float, complex) + _DTypeT = TypeVar("_DTypeT", bound=np.dtype) _DTypeT_co = TypeVar("_DTypeT_co", bound=np.dtype, default=np.dtype, covariant=True) _ShapeT = TypeVar("_ShapeT", bound=_nt.Shape) @@ -712,9 +722,11 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override # type: ignore[override] @overload - def __add__(self: _nt.Array[_ScalarT], x: _nt.Casts[_ScalarT], /) -> _nt.MArray[_ScalarT]: ... + def __add__(self: _nt.MArray[_ScalarT], x: _nt.Casts[_ScalarT], /) -> _nt.MArray[_ScalarT]: ... @overload - def __add__(self: _nt.Array[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], /) -> _nt.MArray[_ScalarT]: ... + def __add__( + self: _nt.MArray[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], / + ) -> _nt.MArray[_ScalarT]: ... @overload def __add__(self: _nt.CastsWithBuiltin[_T, _ScalarT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_ScalarT]: ... @overload @@ -724,31 +736,31 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def __add__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __add__(self: _nt.Array[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> _nt.MArray[np.datetime64]: ... + def __add__(self: _nt.MArray[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> _nt.MArray[np.datetime64]: ... @overload - def __add__(self: _nt.Array[_nt.co_timedelta], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.datetime64]: ... # pyright: ignore[reportOverlappingOverload] + def __add__(self: _nt.MArray[_nt.co_timedelta], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.datetime64]: ... # pyright: ignore[reportOverlappingOverload] @overload - def __add__(self: _nt.Array[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] + def __add__(self: _nt.MArray[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] @overload def __add__( # pyright: ignore[reportOverlappingOverload] - self: _nt.Array[np.str_], x: _nt.ToString_nd[_T], / + self: _nt.MArray[np.str_], x: _nt.ToString_nd[_T], / ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType]: ... @overload def __add__( - self: _nt.StringArrayND[_T], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / + self: MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... @overload def __add__( # pyright: ignore[reportIncompatibleMethodOverride] - self: _nt.Array[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRAdd[_AnyItemT]], / + self: _nt.MArray[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRAdd[_AnyItemT]], / ) -> _nt.MArray[Incomplete]: ... # @override # type: ignore[override] @overload - def __radd__(self: _nt.Array[_ScalarT], x: _nt.Casts[_ScalarT], /) -> _nt.MArray[_ScalarT]: ... + def __radd__(self: _nt.MArray[_ScalarT], x: _nt.Casts[_ScalarT], /) -> _nt.MArray[_ScalarT]: ... @overload def __radd__( - self: _nt.Array[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], / + self: _nt.MArray[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], / ) -> _nt.MArray[_ScalarT]: ... @overload def __radd__(self: _nt.CastsWithBuiltin[_T, _ScalarT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_ScalarT]: ... @@ -759,51 +771,446 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def __radd__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __radd__(self: _nt.Array[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> _nt.MArray[np.datetime64]: ... + def __radd__(self: _nt.MArray[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> _nt.MArray[np.datetime64]: ... @overload - def __radd__(self: _nt.Array[_nt.co_timedelta], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.datetime64]: ... # pyright: ignore[reportOverlappingOverload] + def __radd__(self: _nt.MArray[_nt.co_timedelta], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.datetime64]: ... # pyright: ignore[reportOverlappingOverload] @overload - def __radd__(self: _nt.Array[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] + def __radd__(self: _nt.MArray[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] @overload def __radd__( # pyright: ignore[reportOverlappingOverload] - self: _nt.Array[np.str_], x: _nt.ToString_nd[_T], / + self: _nt.MArray[np.str_], x: _nt.ToString_nd[_T], / ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... @overload def __radd__( - self: _nt.StringArrayND[_T], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / + self: MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... @overload def __radd__( # pyright: ignore[reportIncompatibleMethodOverride] - self: _nt.Array[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanAdd[_AnyItemT]], / + self: _nt.MArray[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanAdd[_AnyItemT]], / ) -> _nt.MArray[Incomplete]: ... # @override # type: ignore[misc, override] @overload - def __iadd__(self: _nt.Array[_ScalarT], x: _nt.Casts[_ScalarT], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + def __iadd__(self: _nt.MArray[_ScalarT], x: _nt.Casts[_ScalarT], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload - def __iadd__(self: _nt.Array[np.bool_], x: _nt.SequenceND[bool], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + def __iadd__(self: _nt.MArray[np.bool_], x: _nt.SequenceND[bool], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload - def __iadd__(self: _nt.Array[np.number], x: _nt.SequenceND[int], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + def __iadd__(self: _nt.MArray[np.number], x: _nt.SequenceND[int], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload - def __iadd__(self: _nt.Array[np.inexact], x: _nt.SequenceND[float], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + def __iadd__(self: _nt.MArray[np.inexact], x: _nt.SequenceND[float], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload def __iadd__( - self: _nt.Array[np.complexfloating], x: _nt.SequenceND[complex], / + self: _nt.MArray[np.complexfloating], x: _nt.SequenceND[complex], / ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload - def __iadd__(self: _nt.Array[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + def __iadd__(self: _nt.MArray[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload - def __iadd__(self: _nt.Array[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + def __iadd__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload def __iadd__( - self: _nt.StringArrayND[_T], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / + self: MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]], x: _nt.ToString_nd[_T] | _nt.ToStr_nd, / ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... @overload def __iadd__( # pyright: ignore[reportIncompatibleMethodOverride] - self: _nt.Array[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRAdd[_AnyItemT, _AnyItemT]], / + self: _nt.MArray[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRAdd[_AnyItemT, _AnyItemT]], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + + # + @override + @overload + def __sub__(self: _nt.MArray[_NumericT], x: _nt.Casts[_NumericT], /) -> _nt.MArray[_NumericT]: ... + @overload + def __sub__(self: _nt.MArray[_CoNumberT], x: _nt.CastsWith[_CoNumberT, _ScalarT], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __sub__(self: _nt.CastsWithBuiltin[_T, _NumericT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_NumericT]: ... + @overload + def __sub__(self: _nt.CastsWithInt[_ScalarT], x: _PyIntND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __sub__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __sub__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __sub__(self: _nt.MArray[np.datetime64], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.timedelta64]: ... + @overload + def __sub__(self: _nt.MArray[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> _nt.MArray[np.datetime64]: ... + @overload + def __sub__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... + @overload + def __sub__( # pyright: ignore[reportIncompatibleMethodOverride, reportOverlappingOverload] + self: _nt.MArray[np.number[_AnyNumberItemT]], x: _nt.Sequence1ND[_nt.op.CanRSub[_AnyNumberItemT]], / + ) -> _nt.MArray[Incomplete]: ... + + # + @override + @overload + def __rsub__(self: _nt.MArray[_NumericT], x: _nt.Casts[_NumericT], /) -> _nt.MArray[_NumericT]: ... + @overload + def __rsub__(self: _nt.MArray[_CoNumberT], x: _nt.CastsWith[_CoNumberT, _ScalarT], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rsub__(self: _nt.CastsWithBuiltin[_T, _NumericT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_NumericT]: ... + @overload + def __rsub__(self: _nt.CastsWithInt[_ScalarT], x: _PyIntND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rsub__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rsub__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rsub__(self: _nt.MArray[np.datetime64], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.timedelta64]: ... + @overload + def __rsub__(self: _nt.MArray[_nt.co_timedelta], x: _nt.ToDateTime_nd, /) -> _nt.MArray[np.datetime64]: ... + @overload + def __rsub__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... + @overload + def __rsub__( # pyright: ignore[reportIncompatibleMethodOverride, reportOverlappingOverload] + self: _nt.MArray[np.number[_AnyNumberItemT]], x: _nt.Sequence1ND[_nt.op.CanSub[_AnyNumberItemT]], / + ) -> _nt.MArray[Incomplete]: ... + + # + @override # type: ignore[misc, override] + @overload + def __isub__(self: _nt.MArray[_ScalarT], x: _nt.Casts[_ScalarT], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __isub__(self: _nt.MArray[np.number], x: _nt.SequenceND[int], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __isub__(self: _nt.MArray[np.inexact], x: _nt.SequenceND[float], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __isub__( + self: _nt.MArray[np.complexfloating], x: _nt.SequenceND[complex], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __isub__(self: _nt.MArray[np.datetime64], x: _nt.CoTimeDelta_nd, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __isub__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __isub__( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.MArray[np.number[_AnyNumberItemT]], + x: _nt.Sequence1ND[_nt.op.CanRSub[_AnyNumberItemT, _AnyNumberItemT]], + /, ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + # + @override # type: ignore[override] + @overload + def __mul__(self: _nt.MArray[_CoNumberT], x: _nt.Casts[_CoNumberT], /) -> _nt.MArray[_CoNumberT]: ... + @overload + def __mul__( + self: _nt.MArray[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], / + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __mul__(self: _nt.CastsWithBuiltin[_T, _ScalarT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __mul__(self: _nt.CastsWithInt[_ScalarT], x: _nt.SequenceND[int], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __mul__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __mul__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __mul__(self: _nt.MArray[np.timedelta64], x: _nt.ToFloating_nd, /) -> _nt.MArray[np.timedelta64]: ... # pyright: ignore[reportOverlappingOverload] + @overload + def __mul__(self: _nt.MArray[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] + @overload + def __mul__( # pyright: ignore[reportOverlappingOverload] + self: _nt.MArray[np.integer], x: _nt.ToString_nd, / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... + @overload + def __mul__( + self: MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]], x: _nt.ToInteger_nd, / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... + @overload + def __mul__( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.MArray[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRMul[_AnyItemT]], / + ) -> _nt.MArray[Incomplete]: ... + + # + @override # type: ignore[override] + @overload + def __rmul__(self: _nt.MArray[_CoNumberT], x: _nt.Casts[_CoNumberT], /) -> _nt.MArray[_CoNumberT]: ... + @overload + def __rmul__( + self: _nt.MArray[_SelfScalarT], x: _nt.CastsWith[_SelfScalarT, _ScalarT], / + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __rmul__(self: _nt.CastsWithBuiltin[_T, _ScalarT], x: _nt.SequenceND[_T], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rmul__(self: _nt.CastsWithInt[_ScalarT], x: _nt.SequenceND[int], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rmul__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rmul__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rmul__(self: _nt.MArray[np.timedelta64], x: _nt.ToFloating_nd, /) -> _nt.MArray[np.timedelta64]: ... # pyright: ignore[reportOverlappingOverload] + @overload + def __rmul__(self: _nt.MArray[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] + @overload + def __rmul__( # pyright: ignore[reportOverlappingOverload] + self: _nt.MArray[np.integer], x: _nt.ToString_nd, / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... + @overload + def __rmul__( + self: MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]], x: _nt.ToInteger_nd, / + ) -> MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]]: ... + @overload + def __rmul__( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.MArray[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanMul[_AnyItemT]], / + ) -> _nt.MArray[Incomplete]: ... + + # + @override # type: ignore[misc, override] + @overload + def __imul__(self: _nt.MArray[_CoNumberT], x: _nt.Casts[_CoNumberT], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__(self: _nt.MArray[bool_], x: _nt.SequenceND[bool], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__(self: _nt.MArray[np.number], x: _nt.SequenceND[int], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__(self: _nt.MArray[np.inexact], x: _nt.SequenceND[float], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__( + self: _nt.MArray[np.complexfloating], x: _nt.SequenceND[complex], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__(self: _nt.MArray[np.timedelta64], x: _nt.CoFloating_nd, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__( + self: MaskedArray[_nt.AnyShape, np.dtypes.StringDType[_T]], x: _nt.ToInteger_nd, / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __imul__( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.MArray[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRMul[_AnyItemT, _AnyItemT]], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + + # + @override + @overload + def __pow__(self: _nt.MArray[_NumberT], x: _nt.Casts[_NumberT], k: None = None, /) -> _nt.MArray[_NumberT]: ... + @overload + def __pow__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, k: None = None, /) -> _nt.MArray[np.int8]: ... + @overload + def __pow__( + self: _nt.MArray[_NumberT], x: _nt.CastsWith[_NumberT, _ScalarT], k: None = None, / + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __pow__( + self: _nt.CastsWithInt[_NumberT], x: _nt.SequenceND[int], k: None = None, / + ) -> _nt.MArray[_NumberT]: ... + @overload + def __pow__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __pow__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __pow__(self: _nt.MArray[np.object_], x: object, k: None = None, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override + @overload + def __rpow__(self: _nt.MArray[_NumberT], x: _nt.Casts[_NumberT], k: None = None, /) -> _nt.MArray[_NumberT]: ... + @overload + def __rpow__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, k: None = None, /) -> _nt.MArray[np.int8]: ... + @overload + def __rpow__( + self: _nt.MArray[_NumberT], x: _nt.CastsWith[_NumberT, _ScalarT], k: None = None, / + ) -> _nt.MArray[_ScalarT]: ... + @overload + def __rpow__( + self: _nt.CastsWithInt[_NumberT], x: _nt.SequenceND[int], k: None = None, / + ) -> _nt.MArray[_NumberT]: ... + @overload + def __rpow__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rpow__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rpow__(self: _nt.MArray[np.object_], x: object, k: None = None, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override # type: ignore[misc, override] + @overload + def __ipow__(self: _nt.MArray[_NumberT], x: _nt.Casts[_NumberT], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ipow__(self: _nt.MArray[np.number], x: _nt.SequenceND[int], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ipow__(self: _nt.MArray[np.inexact], x: _nt.SequenceND[float], /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ipow__( + self: _nt.MArray[np.complexfloating], x: _nt.SequenceND[complex], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ipow__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override + @overload + def __truediv__( + self: np._HasDType[_HasType[_nt.Just[np.number]]], + x: _nt.CoFloat64_nd | np._HasDType[_HasType[_nt.Just[np.number]]], + /, + ) -> _nt.MArray[np.inexact]: ... + @overload + def __truediv__(self: _nt.MArray[_InexactT], x: _nt.Casts[_InexactT], /) -> _nt.MArray[_InexactT]: ... + @overload + def __truediv__(self: _nt.MArray[_ScalarT], x: _nt.CastsWith[_ScalarT, _InexactT], /) -> _nt.MArray[_InexactT]: ... # type: ignore[overload-overlap] + @overload + def __truediv__(self: _nt.CastsWithFloat[_ScalarT], x: _nt.SequenceND[float], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __truediv__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __truediv__(self: _nt.MArray[_nt.co_integer], x: _nt.CoInteger_nd, /) -> _nt.MArray[np.float64]: ... + @overload + def __truediv__(self: _nt.MArray[np.timedelta64], x: _nt.ToTimeDelta_nd, /) -> _nt.MArray[np.float64]: ... + @overload + def __truediv__( + self: _nt.MArray[np.timedelta64], x: _nt.ToInteger_nd | _nt.ToFloating_nd, / + ) -> _nt.MArray[np.timedelta64]: ... + @overload + def __truediv__( + self: _nt.MArray[np.generic[_AnyNumberItemT]], x: _nt.Sequence1ND[_nt.op.CanRTruediv[_AnyNumberItemT]], / + ) -> _nt.MArray[Incomplete]: ... + @overload + def __truediv__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override + @overload + def __rtruediv__( + self: np._HasDType[_HasType[_nt.Just[np.number]]], + x: _nt.CoFloat64_nd | np._HasDType[_HasType[_nt.Just[np.number]]], + /, + ) -> _nt.MArray[np.inexact]: ... + @overload + def __rtruediv__(self: _nt.MArray[_InexactT], x: _nt.Casts[_InexactT], /) -> _nt.MArray[_InexactT]: ... + @overload + def __rtruediv__(self: _nt.MArray[_ScalarT], x: _nt.CastsWith[_ScalarT, _InexactT], /) -> _nt.MArray[_InexactT]: ... # type: ignore[overload-overlap] + @overload + def __rtruediv__(self: _nt.CastsWithFloat[_ScalarT], x: _nt.SequenceND[float], /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rtruediv__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... + @overload + def __rtruediv__(self: _nt.MArray[_nt.co_integer], x: _nt.CoInteger_nd, /) -> _nt.MArray[np.float64]: ... + @overload + def __rtruediv__(self: _nt.MArray[np.timedelta64], x: _nt.ToTimeDelta_nd, /) -> _nt.MArray[np.float64]: ... + @overload + def __rtruediv__( + self: _nt.MArray[np.integer | np.floating], x: _nt.ToTimeDelta_nd, / + ) -> _nt.MArray[np.timedelta64]: ... + @overload + def __rtruediv__( + self: _nt.MArray[np.generic[_AnyNumberItemT]], x: _nt.Sequence1ND[_nt.op.CanTruediv[_AnyNumberItemT]], / + ) -> _nt.MArray[Incomplete]: ... + @overload + def __rtruediv__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override # type: ignore[misc, override] + @overload + def __itruediv__( + self: _nt.MArray[_InexactT], x: _nt.Casts[_InexactT], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __itruediv__( + self: _nt.MArray[np.inexact], x: _nt.SequenceND[float], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __itruediv__( + self: _nt.MArray[np.complexfloating], x: _nt.SequenceND[complex], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __itruediv__( + self: _nt.MArray[np.timedelta64], x: _nt.ToInteger_nd | _nt.ToFloating_nd, / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __itruediv__( + self: _nt.MArray[np.generic[_AnyNumberItemT]], + x: _nt.Sequence1ND[_nt.op.CanRTruediv[_AnyNumberItemT, _AnyNumberItemT]], + /, + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __itruediv__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override + @overload + def __floordiv__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, /) -> _nt.MArray[np.int8]: ... + @overload + def __floordiv__( + self: _nt.MArray[_RealNumberT], x: _nt.Casts[_RealNumberT] | _nt.ToBool_nd, / + ) -> _nt.MArray[_RealNumberT]: ... + @overload + def __floordiv__( + self: _nt.MArray[_RealNumberT], x: _nt.CastsWith[_RealNumberT, _RealScalarT], / + ) -> _nt.MArray[_RealScalarT]: ... + @overload + def __floordiv__(self: _nt.CastsWithInt[_RealScalarT], x: _PyIntND, /) -> _nt.MArray[_RealScalarT]: ... + @overload + def __floordiv__(self: _nt.CastsWithFloat[_RealScalarT], x: _PyFloatND, /) -> _nt.MArray[_RealScalarT]: ... + @overload + def __floordiv__(self: _nt.MArray[np.timedelta64], x: _nt.ToTimeDelta_nd, /) -> _nt.MArray[np.int64]: ... + @overload + def __floordiv__( + self: _nt.MArray[np.timedelta64], x: _nt.ToInteger_nd | _nt.ToFloating_nd, / + ) -> _nt.MArray[np.timedelta64]: ... + @overload + def __floordiv__( + self: _nt.MArray[np.generic[_AnyNumberItemT]], x: _nt.Sequence1ND[_nt.op.CanRFloordiv[_AnyNumberItemT]], / + ) -> _nt.MArray[Incomplete]: ... + @overload + def __floordiv__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override # type: ignore[override] + @overload + def __rfloordiv__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, /) -> _nt.MArray[np.int8]: ... + @overload + def __rfloordiv__( + self: _nt.MArray[_RealNumberT], x: _nt.Casts[_RealNumberT] | _nt.ToBool_nd, / + ) -> _nt.MArray[_RealNumberT]: ... + @overload + def __rfloordiv__( + self: _nt.MArray[_RealNumberT], x: _nt.CastsWith[_RealNumberT, _RealScalarT], / + ) -> _nt.MArray[_RealScalarT]: ... + @overload + def __rfloordiv__(self: _nt.CastsWithInt[_RealScalarT], x: _nt.SequenceND[int], /) -> _nt.MArray[_RealScalarT]: ... + @overload + def __rfloordiv__(self: _nt.CastsWithFloat[_RealScalarT], x: _PyFloatND, /) -> _nt.MArray[_RealScalarT]: ... + @overload + def __rfloordiv__(self: _nt.MArray[np.timedelta64], x: _nt.ToTimeDelta_nd, /) -> _nt.MArray[np.int64]: ... + @overload + def __rfloordiv__( + self: _nt.MArray[np.integer | np.floating], x: _nt.ToTimeDelta_nd, / + ) -> _nt.MArray[np.timedelta64]: ... + @overload + def __rfloordiv__( + self: _nt.MArray[np.generic[_AnyNumberItemT]], x: _nt.Sequence1ND[_nt.op.CanFloordiv[_AnyNumberItemT]], / + ) -> _nt.MArray[Incomplete]: ... + @overload + def __rfloordiv__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # + @override # type: ignore[misc, override] + @overload + def __ifloordiv__( + self: _nt.MArray[_RealNumberT], x: _nt.Casts[_RealNumberT], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ifloordiv__( + self: _nt.MArray[np.integer], x: _nt.SequenceND[int], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ifloordiv__( + self: _nt.MArray[np.floating], x: _nt.SequenceND[float], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ifloordiv__( + self: _nt.MArray[np.timedelta64], x: _nt.ToInteger_nd | _nt.ToFloating_nd, / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ifloordiv__( + self: _nt.MArray[np.generic[_AnyItemT]], x: _nt.Sequence1ND[_nt.op.CanRFloordiv[_AnyItemT, _AnyItemT]], / + ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... + @overload + def __ifloordiv__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... # pyright: ignore[reportIncompatibleMethodOverride] + # @property # type: ignore[misc] @override @@ -828,38 +1235,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def __array_finalize__(self, /, obj: Incomplete) -> None: ... - # - @override - def __sub__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __rsub__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __mul__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __rmul__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __truediv__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __rtruediv__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __floordiv__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __rfloordiv__(self, other: Incomplete, /) -> Incomplete: ... - @override - def __pow__(self, other: Incomplete, /) -> Incomplete: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - @override - def __rpow__(self, other: Incomplete, /) -> Incomplete: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - @override - def __isub__(self, other: Incomplete, /) -> Self: ... - @override - def __imul__(self, other: Incomplete, /) -> Self: ... # type: ignore[override] - @override - def __ifloordiv__(self, other: Incomplete, /) -> Self: ... - @override - def __itruediv__(self, other: Incomplete, /) -> Self: ... - @override - def __ipow__(self, other: Incomplete, /) -> Self: ... # type: ignore[override] - # @override def __reduce__(self) -> Incomplete: ... From a231f1033c17e258acc3d0bdcc3db0e55756ab6c Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:02:06 +0100 Subject: [PATCH 22/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.{?= =?UTF-8?q?real,imag}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index e9883234..c10b05fa 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1212,16 +1212,18 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __ifloordiv__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... # pyright: ignore[reportIncompatibleMethodOverride] # - @property # type: ignore[misc] + @property # type: ignore[explicit-override] @override - def imag(self) -> Incomplete: ... # pyright: ignore[reportIncompatibleMethodOverride] - def get_imag(self) -> Incomplete: ... + def real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.Array[_ScalarT, _ShapeT_co]: ... + @real.setter + def real(self, value: ArrayLike, /) -> None: ... # - @property # type: ignore[misc] + @property # type: ignore[explicit-override] @override - def real(self) -> Incomplete: ... # pyright: ignore[reportIncompatibleMethodOverride] - def get_real(self) -> Incomplete: ... + def imag(self: np._HasDTypeWithImag[_ScalarT], /) -> _nt.Array[_ScalarT, _ShapeT_co]: ... + @imag.setter + def imag(self, value: ArrayLike, /) -> None: ... # @property From cff28a2b55a61b3e937a5fb58e1d042ce8729664 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:04:49 +0100 Subject: [PATCH 23/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.c?= =?UTF-8?q?ount`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index c10b05fa..d1826c6a 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1214,17 +1214,27 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @property # type: ignore[explicit-override] @override - def real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.Array[_ScalarT, _ShapeT_co]: ... + def real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... @real.setter def real(self, value: ArrayLike, /) -> None: ... # @property # type: ignore[explicit-override] @override - def imag(self: np._HasDTypeWithImag[_ScalarT], /) -> _nt.Array[_ScalarT, _ShapeT_co]: ... + def imag(self: np._HasDTypeWithImag[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... @imag.setter def imag(self, value: ArrayLike, /) -> None: ... + # keep in sync with `np.ma.count` + @overload + def count(self, axis: None = None, keepdims: L[False] | _NoValueType = ...) -> int: ... + @overload + def count(self, axis: _ShapeLike, keepdims: bool | _NoValueType = ...) -> _nt.MArray[np.int_]: ... + @overload + def count(self, axis: _ShapeLike | None = None, *, keepdims: L[True]) -> _nt.MArray[np.int_]: ... + @overload + def count(self, axis: _ShapeLike | None, keepdims: L[True]) -> _nt.MArray[np.int_]: ... + # @property @override @@ -1244,7 +1254,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... # - def count(self, axis: Incomplete = None, keepdims: Incomplete = ...) -> Incomplete: ... @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... @override From 9c2a671cb2c5b74252858e06650277510e3b9c16 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:15:31 +0100 Subject: [PATCH 24/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.r?= =?UTF-8?q?eshape`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 62 +++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index d1826c6a..f2075a9e 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1235,6 +1235,66 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def count(self, axis: _ShapeLike | None, keepdims: L[True]) -> _nt.MArray[np.int_]: ... + # Keep in sync with `ndarray.reshape` + @override + @overload # (None) + def reshape(self, shape: None, /, *, order: np._OrderACF = "C", copy: bool | None = None) -> Self: ... + @overload # (empty_sequence) + def reshape( # type: ignore[overload-overlap] # mypy false positive + self, shape: Sequence[Never] | _nt.Shape0, /, *, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[_nt.Rank0, _DTypeT_co]: ... + @overload # (index) + def reshape( + self, size1: CanIndex | _nt.Shape1, /, *, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[_nt.Rank1, _DTypeT_co]: ... + @overload # (index, index) + def reshape( + self, size1: _nt.Shape2, /, *, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[_nt.Rank2, _DTypeT_co]: ... + @overload # (index, index) + def reshape( + self, size1: CanIndex, size2: CanIndex, /, *, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[_nt.Rank2, _DTypeT_co]: ... + @overload # (index, index, index) + def reshape( + self, size1: _nt.Shape3, /, *, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[_nt.Rank3, _DTypeT_co]: ... + @overload # (index, index, index) + def reshape( + self, + size1: CanIndex, + size2: CanIndex, + size3: CanIndex, + /, + *, + order: np._OrderACF = "C", + copy: bool | None = None, + ) -> MaskedArray[_nt.Rank3, _DTypeT_co]: ... + @overload # (index, index, index, index) + def reshape( + self, size1: _nt.Shape4, /, *, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[_nt.Rank4, _DTypeT_co]: ... + @overload # (index, index, index, index) + def reshape( + self, + size1: CanIndex, + size2: CanIndex, + size3: CanIndex, + size4: CanIndex, + /, + *, + order: np._OrderACF = "C", + copy: bool | None = None, + ) -> MaskedArray[_nt.Rank4, _DTypeT_co]: ... + @overload # (int, *(index, ...)) + def reshape( + self, size0: CanIndex, /, *shape: CanIndex, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[Incomplete, _DTypeT_co]: ... + @overload # (sequence[index]) + def reshape( # pyright: ignore[reportIncompatibleMethodOverride] + self, shape: Sequence[CanIndex], /, *, order: np._OrderACF = "C", copy: bool | None = None + ) -> MaskedArray[Incomplete, _DTypeT_co]: ... + # @property @override @@ -1257,8 +1317,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... @override - def reshape(self, *s: Incomplete, **kwargs: Incomplete) -> Incomplete: ... - @override def resize( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] self, newshape: Incomplete, refcheck: Incomplete = ..., order: Incomplete = ... ) -> Incomplete: ... From 75e0e44384b331fa771d963ed1c74448f9257847 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:16:28 +0100 Subject: [PATCH 25/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.r?= =?UTF-8?q?esize`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index f2075a9e..9af26a1b 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1295,6 +1295,10 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): self, shape: Sequence[CanIndex], /, *, order: np._OrderACF = "C", copy: bool | None = None ) -> MaskedArray[Incomplete, _DTypeT_co]: ... + # + @override + def resize(self, newshape: Never, refcheck: bool = True, order: bool = False) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # @property @override @@ -1317,10 +1321,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... @override - def resize( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, newshape: Incomplete, refcheck: Incomplete = ..., order: Incomplete = ... - ) -> Incomplete: ... - @override def put(self, indices: Incomplete, values: Incomplete, mode: Incomplete = ...) -> Incomplete: ... def ids(self) -> Incomplete: ... def iscontiguous(self) -> Incomplete: ... From 3f4897d5fb12ec91b9b2880147d013fabfccb628 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:17:36 +0100 Subject: [PATCH 26/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.p?= =?UTF-8?q?ut`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 9af26a1b..d08f1d4b 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1299,6 +1299,10 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def resize(self, newshape: Never, refcheck: bool = True, order: bool = False) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # + @override + def put(self, indices: _nt.CoInteger_nd, values: ArrayLike, mode: np._ModeKind = "raise") -> None: ... + # @property @override @@ -1320,8 +1324,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - @override - def put(self, indices: Incomplete, values: Incomplete, mode: Incomplete = ...) -> Incomplete: ... def ids(self) -> Incomplete: ... def iscontiguous(self) -> Incomplete: ... @override From 61d5724401a78e8925c4b6040d8c5ad2da7ff283 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:20:24 +0100 Subject: [PATCH 27/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.{?= =?UTF-8?q?ids,iscontiguous}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index d08f1d4b..7d4b13dc 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1303,6 +1303,10 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def put(self, indices: _nt.CoInteger_nd, values: ArrayLike, mode: np._ModeKind = "raise") -> None: ... + # + def ids(self) -> tuple[int, int]: ... + def iscontiguous(self) -> bool: ... + # @property @override @@ -1324,8 +1328,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - def ids(self) -> Incomplete: ... - def iscontiguous(self) -> Incomplete: ... @override def all( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] self, axis: Incomplete = ..., out: Incomplete = ..., keepdims: Incomplete = ... From 5dbd70578c83b2412e34cc6182a50097cdcd9bbe Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:23:29 +0100 Subject: [PATCH 28/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.{?= =?UTF-8?q?any,all}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 42 ++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 7d4b13dc..212f3a0a 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1307,6 +1307,40 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def ids(self) -> tuple[int, int]: ... def iscontiguous(self) -> bool: ... + # Keep in sync with `ma.core.all` + @override # type: ignore[override] + @overload + def all(self, axis: None = None, out: None = None, keepdims: L[False] | _NoValueType = ...) -> bool_: ... + @overload + def all(self, axis: _ShapeLike | None = None, out: None = None, *, keepdims: L[True]) -> _nt.MArray[bool_]: ... + @overload + def all(self, axis: _ShapeLike | None, out: None, keepdims: L[True]) -> _nt.MArray[bool_]: ... + @overload + def all( + self, axis: _ShapeLike | None = None, out: None = None, keepdims: bool | _NoValueType = ... + ) -> bool_ | _nt.MArray[bool_]: ... + @overload + def all(self, axis: _ShapeLike | None = None, *, out: _ArrayT, keepdims: bool | _NoValueType = ...) -> _ArrayT: ... + @overload + def all(self, axis: _ShapeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ...) -> _ArrayT: ... # pyright: ignore[reportIncompatibleMethodOverride] + + # Keep in sync with `ma.core.any` + @override # type: ignore[override] + @overload + def any(self, axis: None = None, out: None = None, keepdims: L[False] | _NoValueType = ...) -> bool_: ... + @overload + def any(self, axis: _ShapeLike | None = None, out: None = None, *, keepdims: L[True]) -> _nt.MArray[bool_]: ... + @overload + def any(self, axis: _ShapeLike | None, out: None, keepdims: L[True]) -> _nt.MArray[bool_]: ... + @overload + def any( + self, axis: _ShapeLike | None = None, out: None = None, keepdims: bool | _NoValueType = ... + ) -> bool_ | _nt.MArray[bool_]: ... + @overload + def any(self, axis: _ShapeLike | None = None, *, out: _ArrayT, keepdims: bool | _NoValueType = ...) -> _ArrayT: ... + @overload + def any(self, axis: _ShapeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ...) -> _ArrayT: ... # pyright: ignore[reportIncompatibleMethodOverride] + # @property @override @@ -1329,14 +1363,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... @override - def all( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., out: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - @override - def any( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., out: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - @override def trace( # pyright: ignore[reportIncompatibleMethodOverride] self, offset: Incomplete = ..., From 280b1032c6029f01feeabc62a98532a4d2879aae Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:25:12 +0100 Subject: [PATCH 29/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.t?= =?UTF-8?q?race`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 212f3a0a..c6d45d18 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1341,6 +1341,32 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def any(self, axis: _ShapeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ...) -> _ArrayT: ... # pyright: ignore[reportIncompatibleMethodOverride] + # Keep in sync with `ndarray.trace` and `ma.core.trace` + @override # type: ignore[override] + @overload + def trace( + self, + offset: CanIndex = 0, + axis1: CanIndex = 0, + axis2: CanIndex = 1, + dtype: DTypeLike | None = None, + out: None = None, + ) -> Any: ... + @overload + def trace( + self, + offset: CanIndex = 0, + axis1: CanIndex = 0, + axis2: CanIndex = 1, + dtype: DTypeLike | None = None, + *, + out: _ArrayT, + ) -> _ArrayT: ... + @overload + def trace( # pyright: ignore[reportIncompatibleMethodOverride] + self, offset: CanIndex, axis1: CanIndex, axis2: CanIndex, dtype: DTypeLike | None, out: _ArrayT + ) -> _ArrayT: ... + # @property @override @@ -1363,15 +1389,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... @override - def trace( # pyright: ignore[reportIncompatibleMethodOverride] - self, - offset: Incomplete = ..., - axis1: Incomplete = ..., - axis2: Incomplete = ..., - dtype: Incomplete = ..., - out: Incomplete = ..., - ) -> Incomplete: ... - @override def dot(self, b: Incomplete, out: Incomplete = ..., strict: Incomplete = ...) -> Incomplete: ... # From 63224b6d45fee160074ff579ed94da220f2729e7 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:26:16 +0100 Subject: [PATCH 30/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.d?= =?UTF-8?q?ot`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index c6d45d18..a87985e8 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1367,6 +1367,13 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): self, offset: CanIndex, axis1: CanIndex, axis2: CanIndex, dtype: DTypeLike | None, out: _ArrayT ) -> _ArrayT: ... + # This differs from `ndarray.dot`, in that 1D dot 1D returns a 0D array. + @override # typoe: ignore[override] + @overload + def dot(self, b: ArrayLike, out: None = None, strict: bool = False) -> _nt.MArray[Any]: ... + @overload + def dot(self, b: ArrayLike, out: _ArrayT, strict: bool = False) -> _ArrayT: ... + # @property @override @@ -1388,8 +1395,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - @override - def dot(self, b: Incomplete, out: Incomplete = ..., strict: Incomplete = ...) -> Incomplete: ... # @override From bc8aa91c4664063cfe152cfee0a6c57d149c54cf Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:27:31 +0100 Subject: [PATCH 31/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.s?= =?UTF-8?q?um`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index a87985e8..9a0581f3 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1374,6 +1374,32 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def dot(self, b: ArrayLike, out: _ArrayT, strict: bool = False) -> _ArrayT: ... + # Keep in sync with `ma.core.sum` + @override # type: ignore[override] + @overload + def sum( + self, + /, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + out: None = None, + keepdims: bool | _NoValueType = ..., + ) -> Any: ... + @overload + def sum( + self, /, axis: _ShapeLike | None, dtype: DTypeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ... + ) -> _ArrayT: ... + @overload + def sum( # pyright: ignore[reportIncompatibleMethodOverride] + self, + /, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + *, + out: _ArrayT, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + # @property @override @@ -1398,10 +1424,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @override - def sum( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., dtype: Incomplete = ..., out: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - @override def cumsum( # pyright: ignore[reportIncompatibleMethodOverride] self, axis: Incomplete = ..., dtype: Incomplete = ..., out: Incomplete = ... ) -> Incomplete: ... From a98b1b30dc00151080253332f2ee2105e4a17f6b Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:28:29 +0100 Subject: [PATCH 32/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.c?= =?UTF-8?q?umsum`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 9a0581f3..c742fb03 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1400,6 +1400,17 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): keepdims: bool | _NoValueType = ..., ) -> _ArrayT: ... + # Keep in sync with `ndarray.cumsum` and `ma.core.cumsum` + @override + @overload # out: None (default) + def cumsum( + self, /, axis: CanIndex | None = None, dtype: DTypeLike | None = None, out: None = None + ) -> MaskedArray: ... + @overload # out: ndarray + def cumsum(self, /, axis: CanIndex | None, dtype: DTypeLike | None, out: _ArrayT) -> _ArrayT: ... + @overload + def cumsum(self, /, axis: CanIndex | None = None, dtype: DTypeLike | None = None, *, out: _ArrayT) -> _ArrayT: ... + # @property @override @@ -1422,12 +1433,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def cumsum( # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., dtype: Incomplete = ..., out: Incomplete = ... - ) -> Incomplete: ... - # @override def prod( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] From 3618cc96e0e3bcda9ac388566f1de9ad5986930b Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:29:56 +0100 Subject: [PATCH 33/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.[?= =?UTF-8?q?cum]prod`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 50 +++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index c742fb03..44723e9f 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1411,6 +1411,45 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def cumsum(self, /, axis: CanIndex | None = None, dtype: DTypeLike | None = None, *, out: _ArrayT) -> _ArrayT: ... + # Keep in sync with `ma.core.prod` + @override # type: ignore[override] + @overload + def prod( + self, + /, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + out: None = None, + keepdims: bool | _NoValueType = ..., + ) -> Any: ... + @overload + def prod( + self, /, axis: _ShapeLike | None, dtype: DTypeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ... + ) -> _ArrayT: ... + @overload + def prod( # pyright: ignore[reportIncompatibleMethodOverride] + self, + /, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + *, + out: _ArrayT, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + + product = prod + + # Keep in sync with `ndarray.cumprod` and `ma.core.cumprod` + @override + @overload # out: None (default) + def cumprod( + self, /, axis: CanIndex | None = None, dtype: DTypeLike | None = None, out: None = None + ) -> MaskedArray: ... + @overload # out: ndarray + def cumprod(self, /, axis: CanIndex | None, dtype: DTypeLike | None, out: _ArrayT) -> _ArrayT: ... + @overload + def cumprod(self, /, axis: CanIndex | None = None, dtype: DTypeLike | None = None, *, out: _ArrayT) -> _ArrayT: ... + # @property @override @@ -1433,17 +1472,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def prod( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., dtype: Incomplete = ..., out: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - product = prod - @override - def cumprod( # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., dtype: Incomplete = ..., out: Incomplete = ... - ) -> Incomplete: ... - # @override def mean( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] From 364a1e3774d03f47488a3055340e9181c00dc19c Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:31:30 +0100 Subject: [PATCH 34/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.m?= =?UTF-8?q?ean`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 44723e9f..43b7cc99 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1370,7 +1370,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # This differs from `ndarray.dot`, in that 1D dot 1D returns a 0D array. @override # typoe: ignore[override] @overload - def dot(self, b: ArrayLike, out: None = None, strict: bool = False) -> _nt.MArray[Any]: ... + def dot(self, b: ArrayLike, out: None = None, strict: bool = False) -> _nt.MArray[Incomplete]: ... @overload def dot(self, b: ArrayLike, out: _ArrayT, strict: bool = False) -> _ArrayT: ... @@ -1384,7 +1384,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): dtype: DTypeLike | None = None, out: None = None, keepdims: bool | _NoValueType = ..., - ) -> Any: ... + ) -> Incomplete: ... @overload def sum( self, /, axis: _ShapeLike | None, dtype: DTypeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ... @@ -1421,7 +1421,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): dtype: DTypeLike | None = None, out: None = None, keepdims: bool | _NoValueType = ..., - ) -> Any: ... + ) -> Incomplete: ... @overload def prod( self, /, axis: _ShapeLike | None, dtype: DTypeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ... @@ -1450,6 +1450,31 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def cumprod(self, /, axis: CanIndex | None = None, dtype: DTypeLike | None = None, *, out: _ArrayT) -> _ArrayT: ... + # Keep in sync with `ma.core.mean` + @override # type: ignore[override] + @overload + def mean( + self, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + out: None = None, + keepdims: bool | _NoValueType = ..., + ) -> Incomplete: ... + @overload + def mean( + self, /, axis: _ShapeLike | None, dtype: DTypeLike | None, out: _ArrayT, keepdims: bool | _NoValueType = ... + ) -> _ArrayT: ... + @overload + def mean( # pyright: ignore[reportIncompatibleMethodOverride] + self, + /, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + *, + out: _ArrayT, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + # @property @override @@ -1472,12 +1497,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def mean( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., dtype: Incomplete = ..., out: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - # def anom(self, axis: Incomplete = ..., dtype: Incomplete = ...) -> Incomplete: ... @override From bb64675de0fcf3ef49204634d482d53e09746b32 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:32:05 +0100 Subject: [PATCH 35/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.a?= =?UTF-8?q?nom`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 43b7cc99..42acab1e 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1475,6 +1475,14 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): keepdims: bool | _NoValueType = ..., ) -> _ArrayT: ... + # keep roughly in sync with `ma.core.anom` + @overload + def anom(self, axis: CanIndex | None = None, dtype: None = None) -> Self: ... + @overload + def anom(self, axis: CanIndex | None = None, *, dtype: DTypeLike) -> MaskedArray[_ShapeT_co]: ... + @overload + def anom(self, axis: CanIndex | None, dtype: DTypeLike) -> MaskedArray[_ShapeT_co]: ... + # @property @override @@ -1498,7 +1506,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def ravel(self, order: Incomplete = ...) -> Incomplete: ... # - def anom(self, axis: Incomplete = ..., dtype: Incomplete = ...) -> Incomplete: ... @override def var( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] self, From 2326dcc7eab5518b58968a8eeb683ce147ac8e61 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:33:23 +0100 Subject: [PATCH 36/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.{?= =?UTF-8?q?var,std}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 92 +++++++++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 24 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 42acab1e..dc79f4aa 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1483,6 +1483,74 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def anom(self, axis: CanIndex | None, dtype: DTypeLike) -> MaskedArray[_ShapeT_co]: ... + # keep in sync with `std` and `ma.core.var` + @override # type: ignore[override] + @overload + def var( + self, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + out: None = None, + ddof: float = 0, + keepdims: bool | _NoValueType = ..., + mean: _nt.CoComplex_nd | _NoValueType = ..., + ) -> Any: ... + @overload + def var( + self, + axis: _ShapeLike | None, + dtype: DTypeLike | None, + out: _ArrayT, + ddof: float = 0, + keepdims: bool | _NoValueType = ..., + mean: _nt.CoComplex_nd | _NoValueType = ..., + ) -> _ArrayT: ... + @overload + def var( # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + *, + out: _ArrayT, + ddof: float = 0, + keepdims: bool | _NoValueType = ..., + mean: _nt.CoComplex_nd | _NoValueType = ..., + ) -> _ArrayT: ... + + # keep in sync with `var` and `ma.core.std` + @override # type: ignore[override] + @overload + def std( + self, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + out: None = None, + ddof: float = 0, + keepdims: bool | _NoValueType = ..., + mean: _nt.CoComplex_nd | _NoValueType = ..., + ) -> Any: ... + @overload + def std( + self, + axis: _ShapeLike | None, + dtype: DTypeLike | None, + out: _ArrayT, + ddof: float = 0, + keepdims: bool | _NoValueType = ..., + mean: _nt.CoComplex_nd | _NoValueType = ..., + ) -> _ArrayT: ... + @overload + def std( # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: _ShapeLike | None = None, + dtype: DTypeLike | None = None, + *, + out: _ArrayT, + ddof: float = 0, + keepdims: bool | _NoValueType = ..., + mean: _nt.CoComplex_nd | _NoValueType = ..., + ) -> _ArrayT: ... + # @property @override @@ -1505,30 +1573,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def var( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, - /, - axis: Incomplete = ..., - dtype: Incomplete = ..., - out: Incomplete = ..., - ddof: float = 0, - keepdims: Incomplete = ..., - mean: Incomplete = ..., - ) -> Incomplete: ... - @override - def std( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, - /, - axis: Incomplete = ..., - dtype: Incomplete = ..., - out: Incomplete = ..., - ddof: float = 0, - keepdims: Incomplete = ..., - mean: Incomplete = ..., - ) -> Incomplete: ... - # @override def round(self, decimals: Incomplete = ..., out: Incomplete = ...) -> Incomplete: ... # pyright: ignore[reportIncompatibleMethodOverride] From d0546fc64c84a6881673878e44d82a0535da85e3 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:34:20 +0100 Subject: [PATCH 37/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.r?= =?UTF-8?q?ound`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index dc79f4aa..a264b334 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1551,6 +1551,15 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): mean: _nt.CoComplex_nd | _NoValueType = ..., ) -> _ArrayT: ... + # Keep in sync with `ndarray.round` + @override + @overload # out=None (default) + def round(self, /, decimals: CanIndex = 0, out: None = None) -> Self: ... + @overload # out=ndarray + def round(self, /, decimals: CanIndex, out: _ArrayT) -> _ArrayT: ... + @overload + def round(self, /, decimals: CanIndex = 0, *, out: _ArrayT) -> _ArrayT: ... + # @property @override @@ -1573,10 +1582,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def round(self, decimals: Incomplete = ..., out: Incomplete = ...) -> Incomplete: ... # pyright: ignore[reportIncompatibleMethodOverride] - # @override def sort( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] From 85c520cd67f14824fa9309c0bbded530a2d49c98 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:38:30 +0100 Subject: [PATCH 38/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.a?= =?UTF-8?q?rg{sort,min,max}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 111 +++++++++++++++++++++++++++++------- 1 file changed, 91 insertions(+), 20 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index a264b334..34ab44c5 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1560,6 +1560,97 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def round(self, /, decimals: CanIndex = 0, *, out: _ArrayT) -> _ArrayT: ... + # + @override + def argsort( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: CanIndex | _NoValueType = ..., + kind: np._SortKind | None = None, + order: str | Sequence[str] | None = None, + endwith: bool = True, + fill_value: _ScalarLike_co | None = None, + *, + stable: bool = False, + ) -> _nt.MArray[np.intp]: ... + + # Keep in-sync with np.ma.argmin + @override # type: ignore[override] + @overload + def argmin( + self, + axis: None = None, + fill_value: _ScalarLike_co | None = None, + out: None = None, + *, + keepdims: L[False] | _NoValueType = ..., + ) -> np.intp: ... + @overload + def argmin( + self, + axis: CanIndex | None = None, + fill_value: _ScalarLike_co | None = None, + out: None = None, + *, + keepdims: bool | _NoValueType = ..., + ) -> Any: ... + @overload + def argmin( + self, + axis: CanIndex | None = None, + fill_value: _ScalarLike_co | None = None, + *, + out: _ArrayT, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + @overload + def argmin( # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: CanIndex | None, + fill_value: _ScalarLike_co | None, + out: _ArrayT, + *, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + + # Keep in-sync with np.ma.argmax + @override # type: ignore[override] + @overload + def argmax( + self, + axis: None = None, + fill_value: _ScalarLike_co | None = None, + out: None = None, + *, + keepdims: L[False] | _NoValueType = ..., + ) -> np.intp: ... + @overload + def argmax( + self, + axis: CanIndex | None = None, + fill_value: _ScalarLike_co | None = None, + out: None = None, + *, + keepdims: bool | _NoValueType = ..., + ) -> Any: ... + @overload + def argmax( + self, + axis: CanIndex | None = None, + fill_value: _ScalarLike_co | None = None, + *, + out: _ArrayT, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + @overload + def argmax( # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: CanIndex | None, + fill_value: _ScalarLike_co | None, + out: _ArrayT, + *, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + # @property @override @@ -1595,38 +1686,18 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): *, stable: bool = False, ) -> Incomplete: ... - @override - def argsort( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, - /, - axis: Incomplete = ..., - kind: Incomplete | None = None, - order: Incomplete | None = None, - endwith: bool = True, - fill_value: Incomplete | None = None, - *, - stable: bool = False, - ) -> Incomplete: ... # @override def min( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] self, axis: Incomplete = ..., out: Incomplete = ..., fill_value: Incomplete = ..., keepdims: Incomplete = ... ) -> Incomplete: ... - @override - def argmin( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., fill_value: Incomplete = ..., out: Incomplete = ..., *, keepdims: Incomplete = ... - ) -> Incomplete: ... # @override def max( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] self, axis: Incomplete = ..., out: Incomplete = ..., fill_value: Incomplete = ..., keepdims: Incomplete = ... ) -> Incomplete: ... - @override - def argmax( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., fill_value: Incomplete = ..., out: Incomplete = ..., *, keepdims: Incomplete = ... - ) -> Incomplete: ... # @override From dd812e58cdcb54b548deb70af1908ac26f005e61 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:39:26 +0100 Subject: [PATCH 39/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.s?= =?UTF-8?q?ort`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 34ab44c5..61d29248 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1560,6 +1560,19 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def round(self, /, decimals: CanIndex = 0, *, out: _ArrayT) -> _ArrayT: ... + # + @override + def sort( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: CanIndex = -1, + kind: np._SortKind | None = None, + order: str | Sequence[str] | None = None, + endwith: bool | None = True, + fill_value: _ScalarLike_co | None = None, + *, + stable: L[False] | None = False, + ) -> None: ... + # @override def argsort( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] @@ -1673,20 +1686,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def sort( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, - /, - axis: Incomplete = -1, - kind: Incomplete | None = None, - order: Incomplete | None = None, - endwith: bool = True, - fill_value: Incomplete | None = None, - *, - stable: bool = False, - ) -> Incomplete: ... - # @override def min( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] From 8a239d98baec5550c2ed49086a40ef39bd8abd93 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:41:32 +0100 Subject: [PATCH 40/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.{?= =?UTF-8?q?min,max,ptp}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 122 ++++++++++++++++++++++++++++++------ 1 file changed, 104 insertions(+), 18 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 61d29248..16d0da6d 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1664,6 +1664,110 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): keepdims: bool | _NoValueType = ..., ) -> _ArrayT: ... + # + @override # type: ignore[override] + @overload + def min( + self: _nt.MArray[_ScalarT], + axis: None = None, + out: None = None, + fill_value: _ScalarLike_co | None = None, + keepdims: L[False] | _NoValueType = ..., + ) -> _ScalarT: ... + @overload + def min( + self, + axis: _ShapeLike | None = None, + out: None = None, + fill_value: _ScalarLike_co | None = None, + keepdims: bool | _NoValueType = ..., + ) -> Any: ... + @overload + def min( + self, + axis: _ShapeLike | None, + out: _ArrayT, + fill_value: _ScalarLike_co | None = None, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + @overload + def min( # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: _ShapeLike | None = None, + *, + out: _ArrayT, + fill_value: _ScalarLike_co | None = None, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + + # + @override # type: ignore[override] + @overload + def max( + self: _nt.MArray[_ScalarT], + axis: None = None, + out: None = None, + fill_value: _ScalarLike_co | None = None, + keepdims: L[False] | _NoValueType = ..., + ) -> _ScalarT: ... + @overload + def max( + self, + axis: _ShapeLike | None = None, + out: None = None, + fill_value: _ScalarLike_co | None = None, + keepdims: bool | _NoValueType = ..., + ) -> Any: ... + @overload + def max( + self, + axis: _ShapeLike | None, + out: _ArrayT, + fill_value: _ScalarLike_co | None = None, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + @overload + def max( # pyright: ignore[reportIncompatibleMethodOverride] + self, + axis: _ShapeLike | None = None, + *, + out: _ArrayT, + fill_value: _ScalarLike_co | None = None, + keepdims: bool | _NoValueType = ..., + ) -> _ArrayT: ... + + # + @override + @overload + def ptp( + self: _nt.MArray[_ScalarT], + axis: None = None, + out: None = None, + fill_value: _ScalarLike_co | None = None, + keepdims: L[False] = False, + ) -> _ScalarT: ... + @overload + def ptp( + self, + axis: _ShapeLike | None = None, + out: None = None, + fill_value: _ScalarLike_co | None = None, + keepdims: bool = False, + ) -> Any: ... + @overload + def ptp( + self, axis: _ShapeLike | None, out: _ArrayT, fill_value: _ScalarLike_co | None = None, keepdims: bool = False + ) -> _ArrayT: ... + @overload + def ptp( # pyright: ignore[reportIncompatibleVariableOverride] + self, + axis: _ShapeLike | None = None, + *, + out: _ArrayT, + fill_value: _ScalarLike_co | None = None, + keepdims: bool = False, + ) -> _ArrayT: ... + # @property @override @@ -1686,24 +1790,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def min( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., out: Incomplete = ..., fill_value: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - - # - @override - def max( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - self, axis: Incomplete = ..., out: Incomplete = ..., fill_value: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - - # - @override - def ptp( # pyright: ignore[reportIncompatibleVariableOverride] - self, axis: Incomplete = ..., out: Incomplete = ..., fill_value: Incomplete = ..., keepdims: Incomplete = ... - ) -> Incomplete: ... - # @override def partition(self, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... From be1523c546d97885e40417f206e9eae384765899 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 13:44:11 +0100 Subject: [PATCH 41/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.[?= =?UTF-8?q?arg]partition`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 51 ++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 16d0da6d..fa930c56 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1768,6 +1768,51 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): keepdims: bool = False, ) -> _ArrayT: ... + # + @override # type: ignore[override] + @overload + def partition( + self, /, kth: _nt.ToInteger_nd, axis: CanIndex = -1, kind: np._PartitionKind = "introselect", order: None = None + ) -> None: ... + @overload + def partition( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.MArray[np.void], + /, + kth: _nt.ToInteger_nd, + axis: CanIndex = -1, + kind: np._PartitionKind = "introselect", + order: str | Sequence[str] | None = None, + ) -> None: ... + + # keep in sync with ndarray.argpartition + @override # type: ignore[override] + @overload # axis: None + def argpartition( + self, kth: _nt.ToInteger_nd, /, axis: None, kind: np._PartitionKind = "introselect", order: None = None + ) -> MaskedArray[_nt.Rank1, np.dtype[np.intp]]: ... + @overload # axis: index (default) + def argpartition( + self, kth: _nt.ToInteger_nd, /, axis: CanIndex = -1, kind: np._PartitionKind = "introselect", order: None = None + ) -> MaskedArray[_ShapeT_co, np.dtype[np.intp]]: ... + @overload # void, axis: None + def argpartition( + self: _nt.MArray[np.void], + kth: _nt.ToInteger_nd, + /, + axis: None, + kind: np._PartitionKind = "introselect", + order: str | Sequence[str] | None = None, + ) -> MaskedArray[_nt.Rank1, np.dtype[np.intp]]: ... + @overload # void, axis: index (default) + def argpartition( # pyright: ignore[reportIncompatibleMethodOverride] + self: _nt.MArray[np.void], + kth: _nt.ToInteger_nd, + /, + axis: CanIndex = -1, + kind: np._PartitionKind = "introselect", + order: str | Sequence[str] | None = None, + ) -> MaskedArray[_ShapeT_co, np.dtype[np.intp]]: ... + # @property @override @@ -1790,12 +1835,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def partition(self, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... - @override - def argpartition(self, *args: Incomplete, **kwargs: Incomplete) -> Incomplete: ... - # @override def take( # pyright: ignore[reportIncompatibleMethodOverride] From c610734a35fffcab36a295b359fad81ac654802c Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:19:27 +0100 Subject: [PATCH 42/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.t?= =?UTF-8?q?ake`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index fa930c56..97bf593f 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1813,6 +1813,33 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): order: str | Sequence[str] | None = None, ) -> MaskedArray[_ShapeT_co, np.dtype[np.intp]]: ... + # Keep in-sync with np.ma.take + @override # type: ignore[override] + @overload + def take( + self: _nt.MArray[_ScalarT], + indices: int | np.integer, + axis: None = None, + out: None = None, + mode: np._ModeKind = "raise", + ) -> _ScalarT: ... + @overload + def take( + self: _nt.MArray[_ScalarT], + indices: _nt.CoInteger_1nd, + axis: CanIndex | None = None, + out: None = None, + mode: np._ModeKind = "raise", + ) -> _nt.MArray[_ScalarT]: ... + @overload + def take( + self, indices: _nt.CoInteger_nd, axis: CanIndex | None, out: _ArrayT, mode: np._ModeKind = "raise" + ) -> _ArrayT: ... + @overload + def take( # pyright: ignore[reportIncompatibleMethodOverride] + self, indices: _nt.CoInteger_nd, axis: CanIndex | None = None, *, out: _ArrayT, mode: np._ModeKind = "raise" + ) -> _ArrayT: ... + # @property @override @@ -1835,12 +1862,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # - @override - def take( # pyright: ignore[reportIncompatibleMethodOverride] - self, /, indices: Incomplete, axis: Incomplete = ..., out: Incomplete = ..., mode: Incomplete = ... - ) -> Incomplete: ... - # @override def copy(self, /, order: _OrderKACF = "C") -> Self: ... From b1e983268e4c93a255df0de16530d1c30b218002 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:21:04 +0100 Subject: [PATCH 43/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.d?= =?UTF-8?q?iagonal`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 97bf593f..014de17c 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1840,6 +1840,33 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): self, indices: _nt.CoInteger_nd, axis: CanIndex | None = None, *, out: _ArrayT, mode: np._ModeKind = "raise" ) -> _ArrayT: ... + # keep in sync with `ndarray.diagonal` + @override + @overload # this overload is a workaround for microsoft/pyright#10232 + def diagonal( # type: ignore[overload-overlap] + self: MaskedArray[_nt.NeitherShape, _DTypeT], /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 + ) -> MaskedArray[_nt.AnyShape, _DTypeT]: ... + @overload + def diagonal( + self: MaskedArray[_nt.Shape2, _DTypeT], /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 + ) -> MaskedArray[_nt.Rank1, _DTypeT]: ... + @overload + def diagonal( + self: MaskedArray[_nt.Shape3, _DTypeT], /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 + ) -> MaskedArray[_nt.Rank2, _DTypeT]: ... + @overload + def diagonal( + self: MaskedArray[_nt.Shape4, _DTypeT], /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 + ) -> MaskedArray[_nt.Rank3, _DTypeT]: ... + @overload + def diagonal( + self: MaskedArray[_nt.Shape4N, _DTypeT], /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 + ) -> MaskedArray[_nt.Rank3N, _DTypeT]: ... + @overload + def diagonal( + self, /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 + ) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + # @property @override @@ -1867,7 +1894,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def copy(self, /, order: _OrderKACF = "C") -> Self: ... # - diagonal: Incomplete flatten: Incomplete repeat: Incomplete squeeze: Incomplete From 8e5051babfe5c928733920991bd24b02fef95aa2 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:24:36 +0100 Subject: [PATCH 44/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.r?= =?UTF-8?q?epeat`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 014de17c..668da54e 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1867,6 +1867,15 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): self, /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 ) -> MaskedArray[_nt.AnyShape, _DTypeT_co]: ... + # keep in sync with `ndarray.repeat` + @override + @overload + def repeat(self, repeats: _nt.CoInteger_nd, /, axis: None = None) -> MaskedArray[_nt.Rank1, _DTypeT_co]: ... + @overload + def repeat( + self: MaskedArray[np._AnyShapeT, _DTypeT], repeats: _nt.CoInteger_nd, /, axis: CanIndex + ) -> MaskedArray[np._AnyShapeT, _DTypeT]: ... + # @property @override @@ -1895,7 +1904,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # flatten: Incomplete - repeat: Incomplete squeeze: Incomplete swapaxes: Incomplete transpose: Incomplete From 68cb7d2e20d3b1212855c427d9dec9b1cd0a1d63 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:25:38 +0100 Subject: [PATCH 45/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.{?= =?UTF-8?q?flatten,ravel}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 668da54e..8d64a899 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1876,6 +1876,12 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): self: MaskedArray[np._AnyShapeT, _DTypeT], repeats: _nt.CoInteger_nd, /, axis: CanIndex ) -> MaskedArray[np._AnyShapeT, _DTypeT]: ... + # keep in sync with `ndarray.flatten` and `ndarray.ravel` + @override + def flatten(self, /, order: _OrderKACF = "C") -> MaskedArray[_nt.Rank1, _DTypeT_co]: ... + @override + def ravel(self, /, order: _OrderKACF = "C") -> MaskedArray[_nt.Rank1, _DTypeT_co]: ... + # @property @override @@ -1894,16 +1900,11 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... - # - @override - def ravel(self, order: Incomplete = ...) -> Incomplete: ... - # @override def copy(self, /, order: _OrderKACF = "C") -> Self: ... # - flatten: Incomplete squeeze: Incomplete swapaxes: Incomplete transpose: Incomplete From 2762be8c746d5ead3b810e779855ee4c148aecd0 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:27:33 +0100 Subject: [PATCH 46/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.s?= =?UTF-8?q?queeze`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 8d64a899..a1f768ae 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1845,7 +1845,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload # this overload is a workaround for microsoft/pyright#10232 def diagonal( # type: ignore[overload-overlap] self: MaskedArray[_nt.NeitherShape, _DTypeT], /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 - ) -> MaskedArray[_nt.AnyShape, _DTypeT]: ... + ) -> MaskedArray[_nt.AnyRank, _DTypeT]: ... @overload def diagonal( self: MaskedArray[_nt.Shape2, _DTypeT], /, offset: CanIndex = 0, axis1: CanIndex = 0, axis2: CanIndex = 1 @@ -1881,6 +1881,10 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def flatten(self, /, order: _OrderKACF = "C") -> MaskedArray[_nt.Rank1, _DTypeT_co]: ... @override def ravel(self, /, order: _OrderKACF = "C") -> MaskedArray[_nt.Rank1, _DTypeT_co]: ... + @override + def squeeze( + self, /, axis: CanIndex | tuple[CanIndex, ...] | None = None + ) -> MaskedArray[_nt.AnyRank, _DTypeT_co]: ... # @property @@ -1905,7 +1909,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def copy(self, /, order: _OrderKACF = "C") -> Self: ... # - squeeze: Incomplete swapaxes: Incomplete transpose: Incomplete From acca313957f7f3be5dcf1c99b31dbdfdf6940fa6 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:28:02 +0100 Subject: [PATCH 47/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.t?= =?UTF-8?q?o{flex,records}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index a1f768ae..fa9119db 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1886,6 +1886,10 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): self, /, axis: CanIndex | tuple[CanIndex, ...] | None = None ) -> MaskedArray[_nt.AnyRank, _DTypeT_co]: ... + # + def toflex(self) -> MaskedArray[_ShapeT_co, np.dtype[np.void]]: ... + def torecords(self) -> MaskedArray[_ShapeT_co, np.dtype[np.void]]: ... + # @property @override @@ -1913,8 +1917,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): transpose: Incomplete # - def toflex(self) -> Incomplete: ... - def torecords(self) -> Incomplete: ... @override def tolist(self, fill_value: Incomplete | None = None) -> Incomplete: ... @override From 4241d57b6c0e80099c584a52af6f19016c8dc9ca Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:28:46 +0100 Subject: [PATCH 48/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.t?= =?UTF-8?q?obytes`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index fa9119db..da32f6b1 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1890,6 +1890,10 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def toflex(self) -> MaskedArray[_ShapeT_co, np.dtype[np.void]]: ... def torecords(self) -> MaskedArray[_ShapeT_co, np.dtype[np.void]]: ... + # + @override + def tobytes(self, /, fill_value: Incomplete | None = None, order: _OrderKACF = "C") -> bytes: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # @property @override @@ -1920,8 +1924,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def tolist(self, fill_value: Incomplete | None = None) -> Incomplete: ... @override - def tobytes(self, /, fill_value: Incomplete | None = None, order: _OrderKACF = "C") -> bytes: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - @override def tofile(self, /, fid: Incomplete, sep: str = "", format: str = "%s") -> Incomplete: ... class mvoid(MaskedArray[_ShapeT_co, _DTypeT_co]): From c663808f5b9e2c069a2e6ea65c4caea875679dea Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:31:10 +0100 Subject: [PATCH 49/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.t?= =?UTF-8?q?olist`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index da32f6b1..4fc61209 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1894,6 +1894,31 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def tobytes(self, /, fill_value: Incomplete | None = None, order: _OrderKACF = "C") -> bytes: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # keep in sync with `ndarray.tolist` + @override + @overload + def tolist( + self: MaskedArray[tuple[Never], np.dtype[np.generic[_T]]], /, fill_value: _ScalarLike_co | None = None + ) -> Any: ... + @overload + def tolist( + self: MaskedArray[tuple[()], np.dtype[np.generic[_T]]], /, fill_value: _ScalarLike_co | None = None + ) -> _T: ... + @overload + def tolist( + self: MaskedArray[tuple[int], np.dtype[np.generic[_T]]], /, fill_value: _ScalarLike_co | None = None + ) -> list[_T]: ... + @overload + def tolist( + self: MaskedArray[tuple[int, int], np.dtype[np.generic[_T]]], /, fill_value: _ScalarLike_co | None = None + ) -> list[list[_T]]: ... + @overload + def tolist( + self: MaskedArray[tuple[int, int, int], np.dtype[np.generic[_T]]], /, fill_value: _ScalarLike_co | None = None + ) -> list[list[list[_T]]]: ... + @overload + def tolist(self, /, fill_value: _ScalarLike_co | None = None) -> Any: ... # pyright: ignore[reportIncompatibleMethodOverride] + # @property @override @@ -1916,16 +1941,6 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def copy(self, /, order: _OrderKACF = "C") -> Self: ... - # - swapaxes: Incomplete - transpose: Incomplete - - # - @override - def tolist(self, fill_value: Incomplete | None = None) -> Incomplete: ... - @override - def tofile(self, /, fid: Incomplete, sep: str = "", format: str = "%s") -> Incomplete: ... - class mvoid(MaskedArray[_ShapeT_co, _DTypeT_co]): def __new__( self, # noqa: PLW0211 From 8cd719afbd169e2a82146a94a5624b7c8d93ccc6 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:31:35 +0100 Subject: [PATCH 50/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.t?= =?UTF-8?q?ofile`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 4fc61209..693d15f3 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1919,6 +1919,10 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def tolist(self, /, fill_value: _ScalarLike_co | None = None) -> Any: ... # pyright: ignore[reportIncompatibleMethodOverride] + # NOTE: will raise `NotImplementedError` + @override + def tofile(self, /, fid: Never, sep: str = "", format: str = "%s") -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + # @property @override From 83ed104dcf2b21a47997814e0a2573386c59f1a2 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:33:03 +0100 Subject: [PATCH 51/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.?= =?UTF-8?q?=5F=5Fdeepcopy=5F=5F`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 693d15f3..06feeb6a 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1923,27 +1923,9 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @override def tofile(self, /, fid: Never, sep: str = "", format: str = "%s") -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] - # - @property - @override - def mT(self) -> Self: ... - @property - @override - def T(self) -> Self: ... - - # - @override - def __array_finalize__(self, /, obj: Incomplete) -> None: ... - - # - @override - def __reduce__(self) -> Incomplete: ... - @override - def __deepcopy__(self, /, memo: Incomplete = ...) -> Self: ... - # @override - def copy(self, /, order: _OrderKACF = "C") -> Self: ... + def __deepcopy__(self, memo: dict[int, Any] | None = None) -> Self: ... class mvoid(MaskedArray[_ShapeT_co, _DTypeT_co]): def __new__( From 416d4c9c406a66343089412761c21777279a0b81 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:38:32 +0100 Subject: [PATCH 52/55] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20`ma.MaskedArray.g?= =?UTF-8?q?et=5F{real,imag}`=20sync=20with=20upstream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 58 +++++++++++++++---------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 06feeb6a..1c26ce75 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -906,7 +906,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def __mul__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __mul__(self: _nt.MArray[np.timedelta64], x: _nt.ToFloating_nd, /) -> _nt.MArray[np.timedelta64]: ... # pyright: ignore[reportOverlappingOverload] + def __mul__(self: _nt.MArray[np.timedelta64], x: _nt.ToFloating_nd, /) -> _nt.MArray[np.timedelta64]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] @overload def __mul__(self: _nt.MArray[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] @overload @@ -939,7 +939,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): @overload def __rmul__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __rmul__(self: _nt.MArray[np.timedelta64], x: _nt.ToFloating_nd, /) -> _nt.MArray[np.timedelta64]: ... # pyright: ignore[reportOverlappingOverload] + def __rmul__(self: _nt.MArray[np.timedelta64], x: _nt.ToFloating_nd, /) -> _nt.MArray[np.timedelta64]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] @overload def __rmul__(self: _nt.MArray[np.object_, Any], x: object, /) -> _nt.MArray[np.object_]: ... # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] @overload @@ -983,46 +983,38 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): ) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... # - @override + @override # type: ignore[override] @overload - def __pow__(self: _nt.MArray[_NumberT], x: _nt.Casts[_NumberT], k: None = None, /) -> _nt.MArray[_NumberT]: ... + def __pow__(self: _nt.MArray[_NumberT], x: _nt.Casts[_NumberT], /) -> _nt.MArray[_NumberT]: ... @overload - def __pow__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, k: None = None, /) -> _nt.MArray[np.int8]: ... + def __pow__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, /) -> _nt.MArray[np.int8]: ... @overload - def __pow__( - self: _nt.MArray[_NumberT], x: _nt.CastsWith[_NumberT, _ScalarT], k: None = None, / - ) -> _nt.MArray[_ScalarT]: ... + def __pow__(self: _nt.MArray[_NumberT], x: _nt.CastsWith[_NumberT, _ScalarT], /) -> _nt.MArray[_ScalarT]: ... @overload - def __pow__( - self: _nt.CastsWithInt[_NumberT], x: _nt.SequenceND[int], k: None = None, / - ) -> _nt.MArray[_NumberT]: ... + def __pow__(self: _nt.CastsWithInt[_NumberT], x: _nt.SequenceND[int], /) -> _nt.MArray[_NumberT]: ... @overload - def __pow__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + def __pow__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __pow__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + def __pow__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __pow__(self: _nt.MArray[np.object_], x: object, k: None = None, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + def __pow__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] # - @override + @override # type: ignore[override] @overload - def __rpow__(self: _nt.MArray[_NumberT], x: _nt.Casts[_NumberT], k: None = None, /) -> _nt.MArray[_NumberT]: ... + def __rpow__(self: _nt.MArray[_NumberT], x: _nt.Casts[_NumberT], /) -> _nt.MArray[_NumberT]: ... @overload - def __rpow__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, k: None = None, /) -> _nt.MArray[np.int8]: ... + def __rpow__(self: _nt.MArray[bool_], x: _nt.ToBool_nd, /) -> _nt.MArray[np.int8]: ... @overload - def __rpow__( - self: _nt.MArray[_NumberT], x: _nt.CastsWith[_NumberT, _ScalarT], k: None = None, / - ) -> _nt.MArray[_ScalarT]: ... + def __rpow__(self: _nt.MArray[_NumberT], x: _nt.CastsWith[_NumberT, _ScalarT], /) -> _nt.MArray[_ScalarT]: ... @overload - def __rpow__( - self: _nt.CastsWithInt[_NumberT], x: _nt.SequenceND[int], k: None = None, / - ) -> _nt.MArray[_NumberT]: ... + def __rpow__(self: _nt.CastsWithInt[_NumberT], x: _nt.SequenceND[int], /) -> _nt.MArray[_NumberT]: ... @overload - def __rpow__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + def __rpow__(self: _nt.CastsWithFloat[_ScalarT], x: _PyFloatND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __rpow__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, k: None = None, /) -> _nt.MArray[_ScalarT]: ... + def __rpow__(self: _nt.CastsWithComplex[_ScalarT], x: _PyComplexND, /) -> _nt.MArray[_ScalarT]: ... @overload - def __rpow__(self: _nt.MArray[np.object_], x: object, k: None = None, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] + def __rpow__(self: _nt.MArray[np.object_], x: object, /) -> _nt.MArray[np.object_]: ... # pyright: ignore[reportIncompatibleMethodOverride] # @override # type: ignore[misc, override] @@ -1212,18 +1204,16 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): def __ifloordiv__(self: _nt.MArray[np.object_], x: object, /) -> MaskedArray[_ShapeT_co, _DTypeT_co]: ... # pyright: ignore[reportIncompatibleMethodOverride] # - @property # type: ignore[explicit-override] + @property # type: ignore[misc] @override - def real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... - @real.setter - def real(self, value: ArrayLike, /) -> None: ... + def real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + def get_real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... # - @property # type: ignore[explicit-override] + @property # type: ignore[misc] @override - def imag(self: np._HasDTypeWithImag[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... - @imag.setter - def imag(self, value: ArrayLike, /) -> None: ... + def imag(self: np._HasDTypeWithImag[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + def get_imag(self: np._HasDTypeWithImag[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... # keep in sync with `np.ma.count` @overload From 24d765544a6430bdc6930361aa5c5806acc20810 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:38:58 +0100 Subject: [PATCH 53/55] =?UTF-8?q?=F0=9F=A9=B9=20fix=20mypy=20error=20in=20?= =?UTF-8?q?`MaskedRecords`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/mrecords.pyi | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/numpy-stubs/ma/mrecords.pyi b/src/numpy-stubs/ma/mrecords.pyi index 90e83920..ac48c5ff 100644 --- a/src/numpy-stubs/ma/mrecords.pyi +++ b/src/numpy-stubs/ma/mrecords.pyi @@ -40,8 +40,6 @@ class MaskedRecords(MaskedArray[_ShapeT_co, _DTypeT_co]): # @property - def _data(self) -> Incomplete: ... - @property def _fieldmask(self) -> Incomplete: ... # From 0e79ffaf4157721eb4035f3b53a784fdc2d5247c Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:43:13 +0100 Subject: [PATCH 54/55] =?UTF-8?q?=E2=9C=85=20update=20runtime=20tests=20fo?= =?UTF-8?q?r=20`ma.find=5Fduplicates`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/@test/runtime/legacy/recfunctions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/numpy-stubs/@test/runtime/legacy/recfunctions.py b/src/numpy-stubs/@test/runtime/legacy/recfunctions.py index ea12a459..89e3594d 100644 --- a/src/numpy-stubs/@test/runtime/legacy/recfunctions.py +++ b/src/numpy-stubs/@test/runtime/legacy/recfunctions.py @@ -151,8 +151,8 @@ def test_find_duplicates() -> None: ndtype = np.dtype([("a", int)]) a = np.ma.ones(7).view(ndtype) - assert_type(rfn.find_duplicates(a), "_nt.MArray[np.void, Any]") + assert_type(rfn.find_duplicates(a), "_nt.MArray[np.void, _nt.Rank1]") assert_type( rfn.find_duplicates(a, ignoremask=True, return_index=True), - "tuple[_nt.MArray[np.void, Any], _nt.Array[np.intp, Any]]", + "tuple[_nt.MArray[np.void, _nt.Rank1], _nt.Array[np.intp, _nt.Rank1]]", ) From e1a35cdfd550761649a8adf020b3f6371c08d30e Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 31 Dec 2025 14:48:36 +0100 Subject: [PATCH 55/55] =?UTF-8?q?=F0=9F=90=B4=20remove=20non-deterministic?= =?UTF-8?q?=20`override`=20error=20ignore=20comment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/ma/core.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/numpy-stubs/ma/core.pyi b/src/numpy-stubs/ma/core.pyi index 1c26ce75..7d58acfa 100644 --- a/src/numpy-stubs/ma/core.pyi +++ b/src/numpy-stubs/ma/core.pyi @@ -1206,7 +1206,7 @@ class MaskedArray(np.ndarray[_ShapeT_co, _DTypeT_co]): # @property # type: ignore[misc] @override - def real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] + def real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... # pyright: ignore[reportIncompatibleMethodOverride] def get_real(self: np._HasDTypeWithReal[_ScalarT], /) -> _nt.MArray[_ScalarT, _ShapeT_co]: ... #