From a0be78a7eb1cf74904555acf433f7e9d7473d76e Mon Sep 17 00:00:00 2001 From: jorenham Date: Sun, 13 Jul 2025 00:11:49 +0200 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=A4=A1=20workaround=20for=20path-depe?= =?UTF-8?q?ndent=20pyright=20bug=20by=20replicating=20`CanArrayND`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scipy-stubs/_typing.pyi | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/scipy-stubs/_typing.pyi b/scipy-stubs/_typing.pyi index 437313eb..309cefe7 100644 --- a/scipy-stubs/_typing.pyi +++ b/scipy-stubs/_typing.pyi @@ -2,9 +2,12 @@ from collections.abc import Sequence from types import TracebackType -from typing import SupportsIndex, TypeAlias, final, type_check_only +from typing import Any, Protocol, SupportsIndex, TypeAlias, final, type_check_only +from typing_extensions import TypeVar -__all__ = "AnyShape", "ExitMixin" +import numpy as np + +__all__ = "AnyShape", "CanArrayND", "ExitMixin" # helper mixins @type_check_only @@ -14,3 +17,17 @@ class ExitMixin: # equivalent to `numpy._typing._shape._ShapeLike` AnyShape: TypeAlias = SupportsIndex | Sequence[SupportsIndex] + +# NOTE: For some reason, `onp.CanArrayND` isn't understood by pyright when running `uv run pyright tests`, even though it works +# fine when running `uv run pyright` in the root directory (same story for basedpyright). By copying the definition here, these +# Pyright won't report false positives (no idea why though), so this is but a workaround. +# https://github.com/jorenham/optype/blob/abf1758/optype/numpy/_array.py#L124-L133 +# TODO(jorenham): Remove this workaround once the issue is fixed in Pyright. + +_SCT_co = TypeVar("_SCT_co", bound=np.generic, covariant=True) +_NDT_co = TypeVar("_NDT_co", bound=tuple[int, ...], default=tuple[Any, ...], covariant=True) + +@type_check_only +class CanArrayND(Protocol[_SCT_co, _NDT_co]): + def __len__(self, /) -> int: ... + def __array__(self, /) -> np.ndarray[_NDT_co, np.dtype[_SCT_co]]: ... From 1141397d8ea744d29d35c517965f061b6068b329 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sun, 13 Jul 2025 00:44:00 +0200 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=A4=A1=20`fft`:=20use=20`CanArrayND`?= =?UTF-8?q?=20from=20`scipy.=5Ftyping`=20instead=20of=20`optype.numpy`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scipy-stubs/fft/_basic.pyi | 23 ++++---- scipy-stubs/fft/_fftlog.pyi | 18 +++--- scipy-stubs/fft/_realtransforms.pyi | 37 +++++++------ scipy-stubs/fft/_realtransforms_backend.pyi | 61 +++++++++++++-------- 4 files changed, 82 insertions(+), 57 deletions(-) diff --git a/scipy-stubs/fft/_basic.pyi b/scipy-stubs/fft/_basic.pyi index 0ba26f7c..16a38365 100644 --- a/scipy-stubs/fft/_basic.pyi +++ b/scipy-stubs/fft/_basic.pyi @@ -6,23 +6,26 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc -from scipy._typing import AnyShape +from scipy._typing import ( + AnyShape, + CanArrayND, # path-dependent Pyright bug workaround +) _ShapeT = TypeVar("_ShapeT", bound=tuple[int, ...]) _Norm: TypeAlias = Literal["backward", "ortho", "forward"] _Unused: TypeAlias = Never # not used by scipy -_AsFloat32: TypeAlias = onp.CanArrayND[npc.floating32, _ShapeT] -_AsFloat64: TypeAlias = onp.CanArrayND[np.bool_ | npc.integer | npc.floating64, _ShapeT] -_AsFloat80: TypeAlias = onp.CanArrayND[np.longdouble, _ShapeT] +_CoInteger: TypeAlias = npc.integer | np.bool_ +_AsFloat32: TypeAlias = CanArrayND[npc.floating32, _ShapeT] +_AsFloat64: TypeAlias = CanArrayND[npc.floating64 | _CoInteger, _ShapeT] +_AsFloat80: TypeAlias = CanArrayND[np.longdouble, _ShapeT] +_AsComplex64: TypeAlias = CanArrayND[npc.inexact32, _ShapeT] +_AsComplex128: TypeAlias = CanArrayND[npc.inexact64 | _CoInteger, _ShapeT] +_AsComplex160: TypeAlias = CanArrayND[np.longdouble | np.clongdouble, _ShapeT] -_AsComplex64: TypeAlias = onp.CanArrayND[np.float32 | np.complex64, _ShapeT] -_AsComplex128: TypeAlias = onp.CanArrayND[np.bool_ | npc.integer | np.float64 | np.complex128, _ShapeT] -_AsComplex160: TypeAlias = onp.CanArrayND[np.longdouble | np.clongdouble, _ShapeT] - -_ToFloat64_ND: TypeAlias = onp.ToArrayND[float, np.bool_ | npc.integer | np.float64] -_ToComplex128_ND: TypeAlias = onp.ToArrayND[complex, np.bool_ | npc.integer | npc.inexact64] +_ToFloat64_ND: TypeAlias = onp.ToArrayND[float, npc.floating64 | _CoInteger] +_ToComplex128_ND: TypeAlias = onp.ToArrayND[complex, npc.inexact64 | _CoInteger] ### # 1-D diff --git a/scipy-stubs/fft/_fftlog.pyi b/scipy-stubs/fft/_fftlog.pyi index b803e10b..deb7c400 100644 --- a/scipy-stubs/fft/_fftlog.pyi +++ b/scipy-stubs/fft/_fftlog.pyi @@ -5,6 +5,8 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround + __all__ = ["fht", "fhtoffset", "ifht"] _FloatT = TypeVar("_FloatT", bound=np.float32 | np.float64 | np.longdouble) @@ -12,10 +14,6 @@ _ShapeT = TypeVar("_ShapeT", bound=tuple[int, ...]) ### -@overload -def fht( - a: onp.CanArrayND[_FloatT, _ShapeT], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 -) -> onp.ArrayND[_FloatT, _ShapeT]: ... @overload def fht( a: Sequence[float], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 @@ -29,16 +27,16 @@ def fht( a: Sequence[Sequence[Sequence[float]]], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 ) -> onp.Array3D[np.float64]: ... @overload +def fht( + a: CanArrayND[_FloatT, _ShapeT], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 +) -> onp.ArrayND[_FloatT, _ShapeT]: ... +@overload def fht( a: onp.ToFloatND, dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 ) -> onp.ArrayND[npc.floating]: ... # @overload -def ifht( - A: onp.CanArrayND[_FloatT, _ShapeT], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 -) -> onp.ArrayND[_FloatT, _ShapeT]: ... -@overload def ifht( A: Sequence[float], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 ) -> onp.Array1D[np.float64]: ... @@ -51,6 +49,10 @@ def ifht( A: Sequence[Sequence[Sequence[float]]], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 ) -> onp.Array3D[np.float64]: ... @overload +def ifht( + A: CanArrayND[_FloatT, _ShapeT], dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 +) -> onp.ArrayND[_FloatT, _ShapeT]: ... +@overload def ifht( A: onp.ToFloatND, dln: onp.ToFloat, mu: onp.ToFloat, offset: onp.ToFloat = 0.0, bias: onp.ToFloat = 0.0 ) -> onp.ArrayND[npc.floating]: ... diff --git a/scipy-stubs/fft/_realtransforms.pyi b/scipy-stubs/fft/_realtransforms.pyi index a5676ab7..d98767f4 100644 --- a/scipy-stubs/fft/_realtransforms.pyi +++ b/scipy-stubs/fft/_realtransforms.pyi @@ -6,7 +6,10 @@ import optype.numpy as onp import optype.numpy.compat as npc from ._typing import DCTType, NormalizationMode -from scipy._typing import AnyShape +from scipy._typing import ( + AnyShape, + CanArrayND, # path-dependent Pyright bug workaround +) __all__ = ["dct", "dctn", "dst", "dstn", "idct", "idctn", "idst", "idstn"] @@ -21,7 +24,7 @@ _FloatND: TypeAlias = onp.ArrayND[np.float32 | np.float64 | np.longdouble] # do @overload def dctn( - x: onp.CanArrayND[npc.integer, _ShapeT], + x: CanArrayND[npc.integer, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -33,7 +36,7 @@ def dctn( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def dctn( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -83,7 +86,7 @@ def dctn( # @overload def idctn( - x: onp.CanArrayND[npc.integer, _ShapeT], + x: CanArrayND[npc.integer, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -94,7 +97,7 @@ def idctn( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def idctn( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -140,7 +143,7 @@ def idctn( # @overload def dstn( - x: onp.CanArrayND[npc.integer, _ShapeT], + x: CanArrayND[npc.integer, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -151,7 +154,7 @@ def dstn( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def dstn( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -197,7 +200,7 @@ def dstn( # @overload def idstn( - x: onp.CanArrayND[npc.integer, _ShapeT], + x: CanArrayND[npc.integer, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -208,7 +211,7 @@ def idstn( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def idstn( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, s: _ToIntOrND | None = None, axes: AnyShape | None = None, @@ -254,7 +257,7 @@ def idstn( # @overload def dct( - x: onp.CanArrayND[np.integer, _ShapeT], + x: CanArrayND[np.integer, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, @@ -265,7 +268,7 @@ def dct( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def dct( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, @@ -311,7 +314,7 @@ def dct( # @overload def idct( - x: onp.CanArrayND[np.integer, _ShapeT], + x: CanArrayND[np.integer, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, @@ -322,7 +325,7 @@ def idct( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def idct( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, @@ -368,7 +371,7 @@ def idct( # @overload def dst( - x: onp.CanArrayND[np.integer, _ShapeT], + x: CanArrayND[np.integer, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, @@ -379,7 +382,7 @@ def dst( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def dst( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, @@ -425,7 +428,7 @@ def dst( # @overload def idst( - x: onp.CanArrayND[np.integer, _ShapeT], + x: CanArrayND[np.integer, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, @@ -436,7 +439,7 @@ def idst( ) -> onp.Array[_ShapeT, np.float64]: ... @overload def idst( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, n: onp.ToInt | None = None, axis: op.CanIndex = -1, diff --git a/scipy-stubs/fft/_realtransforms_backend.pyi b/scipy-stubs/fft/_realtransforms_backend.pyi index 3be1f280..e8e974ba 100644 --- a/scipy-stubs/fft/_realtransforms_backend.pyi +++ b/scipy-stubs/fft/_realtransforms_backend.pyi @@ -1,4 +1,4 @@ -from typing import TypeVar, overload +from typing import TypeAlias, TypeVar, overload import numpy as np import optype as op @@ -7,45 +7,62 @@ import optype.numpy.compat as npc from ._realtransforms import dct, dctn, dst, dstn, idct, idst from ._typing import DCTType, NormalizationMode -from scipy._typing import AnyShape +from scipy._typing import ( + AnyShape, + CanArrayND, # path-dependent Pyright bug workaround +) __all__ = ["dct", "dctn", "dst", "dstn", "idct", "idctn", "idst", "idstn"] _ShapeT = TypeVar("_ShapeT", bound=tuple[int, ...]) _DTypeT = TypeVar("_DTypeT", bound=np.dtype[np.float32 | np.float64 | np.longdouble | npc.complexfloating]) -# NOTE: Unlike the ones in `scipy.fft._realtransforms`, `orthogonalize` is keyword-only here. +_ToIntOrND: TypeAlias = onp.ToInt | onp.ToIntND + +### # @overload def idctn( - x: onp.CanArrayND[npc.integer, _ShapeT], + x: CanArrayND[npc.integer, _ShapeT], + type: DCTType = 2, + s: _ToIntOrND | None = None, + axes: AnyShape | None = None, + norm: NormalizationMode | None = None, + overwrite_x: op.CanBool = False, + workers: onp.ToInt | None = None, + *, + orthogonalize: op.CanBool | None = None, +) -> onp.ArrayND[np.float64, _ShapeT]: ... +@overload +def idctn( + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, workers: onp.ToInt | None = None, *, orthogonalize: op.CanBool | None = None, -) -> onp.Array[_ShapeT, np.float64]: ... +) -> onp.ArrayND[np.float32, _ShapeT]: ... @overload def idctn( - x: onp.CanArrayND[np.float16, _ShapeT], + x: onp.CanArray[_ShapeT, _DTypeT], type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, workers: onp.ToInt | None = None, *, orthogonalize: op.CanBool | None = None, -) -> onp.Array[_ShapeT, np.float32]: ... +) -> np.ndarray[_ShapeT, _DTypeT]: ... @overload def idctn( - x: onp.ToJustFloat64_ND, + x: onp.SequenceND[float], type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, @@ -57,7 +74,7 @@ def idctn( def idctn( x: onp.ToFloatND, type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, @@ -69,33 +86,33 @@ def idctn( # @overload def idstn( - x: onp.CanArrayND[npc.integer, _ShapeT], + x: CanArrayND[npc.integer, _ShapeT], type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, workers: onp.ToInt | None = None, *, orthogonalize: op.CanBool | None = None, -) -> onp.Array[_ShapeT, np.float64]: ... +) -> onp.ArrayND[np.float64, _ShapeT]: ... @overload def idstn( - x: onp.CanArrayND[np.float16, _ShapeT], + x: CanArrayND[np.float16, _ShapeT], type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, workers: onp.ToInt | None = None, *, orthogonalize: op.CanBool | None = None, -) -> onp.Array[_ShapeT, np.float32]: ... +) -> onp.ArrayND[np.float32, _ShapeT]: ... @overload def idstn( x: onp.CanArray[_ShapeT, _DTypeT], type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, @@ -105,9 +122,9 @@ def idstn( ) -> np.ndarray[_ShapeT, _DTypeT]: ... @overload def idstn( - x: onp.ToJustFloat64_ND, + x: onp.SequenceND[float], type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, @@ -119,7 +136,7 @@ def idstn( def idstn( x: onp.ToFloatND, type: DCTType = 2, - s: onp.ToInt | onp.ToIntND | None = None, + s: _ToIntOrND | None = None, axes: AnyShape | None = None, norm: NormalizationMode | None = None, overwrite_x: op.CanBool = False, From 3e689fae98ac2145a5b05dcd700fe9a7c859f1e9 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sun, 13 Jul 2025 01:03:07 +0200 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=A4=A1=20`sparse`:=20use=20`CanArrayN?= =?UTF-8?q?D`=20from=20`scipy.=5Ftyping`=20instead=20of=20`optype.numpy`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scipy-stubs/sparse/_base.pyi | 5 +++-- scipy-stubs/sparse/_bsr.pyi | 3 ++- scipy-stubs/sparse/_construct.pyi | 5 +++-- scipy-stubs/sparse/_coo.pyi | 3 ++- scipy-stubs/sparse/_csc.pyi | 3 ++- scipy-stubs/sparse/_csr.pyi | 7 ++++--- scipy-stubs/sparse/_data.pyi | 7 ++++--- scipy-stubs/sparse/_dia.pyi | 3 ++- scipy-stubs/sparse/_dok.pyi | 11 ++++++----- scipy-stubs/sparse/_extract.pyi | 3 ++- scipy-stubs/sparse/_lil.pyi | 3 ++- scipy-stubs/sparse/_matrix.pyi | 3 ++- scipy-stubs/sparse/_sputils.pyi | 5 +++-- scipy-stubs/sparse/csgraph/_min_spanning_tree.pyi | 3 ++- scipy-stubs/sparse/csgraph/_traversal.pyi | 3 ++- scipy-stubs/sparse/csgraph/_validation.pyi | 3 ++- scipy-stubs/sparse/linalg/_interface.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/_gcrotmk.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/iterative.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/lgmres.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/lsmr.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/lsqr.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/minres.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/tfqmr.pyi | 3 ++- scipy-stubs/sparse/linalg/_isolve/utils.pyi | 3 ++- 25 files changed, 61 insertions(+), 36 deletions(-) diff --git a/scipy-stubs/sparse/_base.pyi b/scipy-stubs/sparse/_base.pyi index 59455fb1..026f6ef0 100644 --- a/scipy-stubs/sparse/_base.pyi +++ b/scipy-stubs/sparse/_base.pyi @@ -35,6 +35,7 @@ from ._lil import lil_array, lil_matrix from ._matrix import spmatrix as spmatrix from ._typing import _Format from scipy._lib._sparse import SparseABC, issparse +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["SparseEfficiencyWarning", "SparseWarning", "issparse", "isspmatrix", "sparray"] @@ -83,7 +84,7 @@ _ToFloat: TypeAlias = npc.floating | _ToInt _ToComplex64: TypeAlias = np.complex64 | _ToFloat _ToSparseSeq: TypeAlias = Sequence[Sequence[_T]] | Sequence[_T] -_ToSparseArray: TypeAlias = onp.CanArrayND[_ScalarT_co] | _ToSparseSeq[_ScalarT_co] +_ToSparseArray: TypeAlias = CanArrayND[_ScalarT_co] | _ToSparseSeq[_ScalarT_co] _SpMatrix: TypeAlias = ( bsr_matrix[_ScalarT] @@ -127,7 +128,7 @@ _ToCSRArray: TypeAlias = coo_array[_ScalarT] | csr_array[_ScalarT] | dia_array[_ _ToCSRMatrix: TypeAlias = coo_matrix[_ScalarT] | csr_matrix[_ScalarT] | dia_matrix[_ScalarT] | dok_matrix[_ScalarT] _SparseLike: TypeAlias = _T | _ScalarT | _spbase[_ScalarT] -_To2D: TypeAlias = Sequence[Sequence[_T | _ScalarT] | onp.CanArrayND[_ScalarT]] | onp.CanArrayND[_ScalarT] +_To2D: TypeAlias = Sequence[Sequence[_T | _ScalarT] | CanArrayND[_ScalarT]] | CanArrayND[_ScalarT] _To2DLike: TypeAlias = Sequence[_T | _ScalarT] | _To2D[_T, _ScalarT] _BinOp: TypeAlias = Callable[[object, object], Any] diff --git a/scipy-stubs/sparse/_bsr.pyi b/scipy-stubs/sparse/_bsr.pyi index cd40f854..eb863794 100644 --- a/scipy-stubs/sparse/_bsr.pyi +++ b/scipy-stubs/sparse/_bsr.pyi @@ -14,6 +14,7 @@ from ._coo import coo_array, coo_matrix from ._data import _minmax_mixin from ._matrix import spmatrix from ._typing import _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["bsr_array", "bsr_matrix", "isspmatrix_bsr"] @@ -24,7 +25,7 @@ _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) _ScalarT_co = TypeVar("_ScalarT_co", bound=npc.number | np.bool_, default=Any, covariant=True) _ToMatrixPy: TypeAlias = Sequence[_T] | Sequence[Sequence[_T]] -_ToMatrix: TypeAlias = _spbase[_ScalarT] | onp.CanArrayND[_ScalarT] | Sequence[onp.CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] +_ToMatrix: TypeAlias = _spbase[_ScalarT] | CanArrayND[_ScalarT] | Sequence[CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] _ToData2: TypeAlias = tuple[onp.ArrayND[_ScalarT], onp.ArrayND[npc.integer]] _ToData3: TypeAlias = tuple[onp.ArrayND[_ScalarT], onp.ArrayND[npc.integer], onp.ArrayND[npc.integer]] diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 2cf16e25..919e6241 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -18,6 +18,7 @@ from ._dok import dok_array, dok_matrix from ._lil import lil_array, lil_matrix from ._matrix import spmatrix from ._typing import _CanStack, _CanStackAs, _Format, _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = [ "block_array", @@ -45,8 +46,8 @@ _ShapeT = TypeVar("_ShapeT", bound=tuple[int, *tuple[int, ...]], default=tuple[A _Numeric: TypeAlias = npc.number | np.bool_ -_ToArray1D: TypeAlias = Seq[_SCT] | onp.CanArrayND[_SCT] -_ToArray2D: TypeAlias = Seq[Seq[_SCT | int] | onp.CanArrayND[_SCT]] | onp.CanArrayND[_SCT] +_ToArray1D: TypeAlias = Seq[_SCT] | CanArrayND[_SCT] +_ToArray2D: TypeAlias = Seq[Seq[_SCT | int] | CanArrayND[_SCT]] | CanArrayND[_SCT] _ToSpMatrix: TypeAlias = spmatrix[_SCT] | _ToArray2D[_SCT] _ToSparse2D: TypeAlias = _spbase[_SCT, tuple[int, int]] | _ToArray2D[_SCT] diff --git a/scipy-stubs/sparse/_coo.pyi b/scipy-stubs/sparse/_coo.pyi index 3f84f221..ccf5f8e2 100644 --- a/scipy-stubs/sparse/_coo.pyi +++ b/scipy-stubs/sparse/_coo.pyi @@ -14,6 +14,7 @@ from ._base import _spbase, sparray from ._data import _data_matrix, _minmax_mixin from ._matrix import spmatrix from ._typing import _ToShape1D, _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["coo_array", "coo_matrix", "isspmatrix_coo"] @@ -575,7 +576,7 @@ class coo_matrix(_coo_base[_ScalarT_co, tuple[int, int]], spmatrix[_ScalarT_co], def __init__( self, /, - arg1: _spbase[_ScalarT_co, _ShapeT_co] | onp.CanArrayND[_ScalarT_co], + arg1: _spbase[_ScalarT_co, _ShapeT_co] | CanArrayND[_ScalarT_co], shape: _ShapeT_co | None = None, dtype: onp.ToDType[_ScalarT_co] | None = None, copy: bool = False, diff --git a/scipy-stubs/sparse/_csc.pyi b/scipy-stubs/sparse/_csc.pyi index eae14015..a2561e8a 100644 --- a/scipy-stubs/sparse/_csc.pyi +++ b/scipy-stubs/sparse/_csc.pyi @@ -12,6 +12,7 @@ from ._compressed import _cs_matrix from ._csr import _csr_base, csr_array, csr_matrix from ._matrix import spmatrix from ._typing import _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["csc_array", "csc_matrix", "isspmatrix_csc"] @@ -20,7 +21,7 @@ _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) _ScalarT_co = TypeVar("_ScalarT_co", bound=npc.number | np.bool_, default=Any, covariant=True) _ToMatrixPy: TypeAlias = Sequence[_T] | Sequence[Sequence[_T]] -_ToMatrix: TypeAlias = _spbase[_ScalarT] | onp.CanArrayND[_ScalarT] | Sequence[onp.CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] +_ToMatrix: TypeAlias = _spbase[_ScalarT] | CanArrayND[_ScalarT] | Sequence[CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] ### diff --git a/scipy-stubs/sparse/_csr.pyi b/scipy-stubs/sparse/_csr.pyi index 000bfa56..b600fb94 100644 --- a/scipy-stubs/sparse/_csr.pyi +++ b/scipy-stubs/sparse/_csr.pyi @@ -13,6 +13,7 @@ from ._compressed import _cs_matrix from ._csc import csc_array, csc_matrix from ._matrix import spmatrix from ._typing import _ToShape1D, _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["csr_array", "csr_matrix", "isspmatrix_csr"] @@ -25,7 +26,7 @@ _ShapeT_co = TypeVar("_ShapeT_co", bound=tuple[int] | tuple[int, int], default=t _NeitherD: TypeAlias = tuple[Never] | tuple[Never, Never] _ToMatrixPy: TypeAlias = Sequence[_T] | Sequence[Sequence[_T]] -_ToMatrix: TypeAlias = _spbase[_ScalarT] | onp.CanArrayND[_ScalarT] | Sequence[onp.CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] +_ToMatrix: TypeAlias = _spbase[_ScalarT] | CanArrayND[_ScalarT] | Sequence[CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] _ToData2B: TypeAlias = tuple[onp.ArrayND[_ScalarT], onp.ArrayND[npc.integer]] # bsr _ToData2C: TypeAlias = tuple[onp.ArrayND[_ScalarT], tuple[onp.ArrayND[npc.integer], onp.ArrayND[npc.integer]]] # csc, csr @@ -80,7 +81,7 @@ class csr_array(_csr_base[_ScalarT_co, _ShapeT_co], sparray[_ScalarT_co, _ShapeT def __init__( self, /, - arg1: _spbase[_ScalarT_co, _ShapeT_co] | onp.CanArrayND[_ScalarT_co, _ShapeT_co], + arg1: _spbase[_ScalarT_co, _ShapeT_co] | CanArrayND[_ScalarT_co, _ShapeT_co], shape: _ShapeT_co | None = None, dtype: onp.ToDType[_ScalarT_co] | None = None, copy: bool = False, @@ -102,7 +103,7 @@ class csr_array(_csr_base[_ScalarT_co, _ShapeT_co], sparray[_ScalarT_co, _ShapeT def __init__( self: csr_array[_ScalarT, tuple[int, int]], /, - arg1: Sequence[Sequence[_ScalarT] | onp.CanArrayND[_ScalarT]], # assumes max. 2-d + arg1: Sequence[Sequence[_ScalarT] | CanArrayND[_ScalarT]], # assumes max. 2-d shape: _ToShape2D | None = None, dtype: onp.ToDType[_ScalarT] | None = None, copy: bool = False, diff --git a/scipy-stubs/sparse/_data.pyi b/scipy-stubs/sparse/_data.pyi index 832d6b64..ce4bab77 100644 --- a/scipy-stubs/sparse/_data.pyi +++ b/scipy-stubs/sparse/_data.pyi @@ -11,6 +11,7 @@ from ._base import _spbase, sparray from ._coo import coo_array, coo_matrix from ._matrix import spmatrix from ._sputils import _ScalarLike +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__: list[str] = [] @@ -63,7 +64,7 @@ class _data_matrix(_spbase[_ScalarT_co, _ShapeT_co], Generic[_ScalarT_co, _Shape # @overload def __init__( - self, /, arg1: _spbase[_ScalarT_co, _ShapeT_co] | onp.CanArrayND[_ScalarT_co, _ShapeT_co], *, maxprint: int | None = None + self, /, arg1: _spbase[_ScalarT_co, _ShapeT_co] | CanArrayND[_ScalarT_co, _ShapeT_co], *, maxprint: int | None = None ) -> None: ... @overload def __init__( @@ -73,7 +74,7 @@ class _data_matrix(_spbase[_ScalarT_co, _ShapeT_co], Generic[_ScalarT_co, _Shape def __init__( self: _data_matrix[_ScalarT, tuple[int, int]], /, - arg1: Sequence[onp.CanArrayND[_ScalarT] | Sequence[_ScalarT]], + arg1: Sequence[CanArrayND[_ScalarT] | Sequence[_ScalarT]], *, maxprint: int | None = None, ) -> None: ... @@ -90,7 +91,7 @@ class _data_matrix(_spbase[_ScalarT_co, _ShapeT_co], Generic[_ScalarT_co, _Shape maxprint: int | None = None, ) -> None: ... @overload - def __init__(self, /, arg1: onp.CanArrayND[_ScalarT_co], *, maxprint: int | None = None) -> None: ... + def __init__(self, /, arg1: CanArrayND[_ScalarT_co], *, maxprint: int | None = None) -> None: ... # @override diff --git a/scipy-stubs/sparse/_dia.pyi b/scipy-stubs/sparse/_dia.pyi index 44012594..96f04fe3 100644 --- a/scipy-stubs/sparse/_dia.pyi +++ b/scipy-stubs/sparse/_dia.pyi @@ -13,6 +13,7 @@ from ._coo import coo_array, coo_matrix from ._data import _data_matrix from ._matrix import spmatrix from ._typing import _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["dia_array", "dia_matrix", "isspmatrix_dia"] @@ -21,7 +22,7 @@ _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) _ScalarT_co = TypeVar("_ScalarT_co", bound=npc.number | np.bool_, default=Any, covariant=True) _ToMatrixPy: TypeAlias = Sequence[_T] | Sequence[Sequence[_T]] -_ToMatrix: TypeAlias = _spbase[_ScalarT] | onp.CanArrayND[_ScalarT] | Sequence[onp.CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] +_ToMatrix: TypeAlias = _spbase[_ScalarT] | CanArrayND[_ScalarT] | Sequence[CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] _ToData: TypeAlias = tuple[onp.ArrayND[_ScalarT], onp.ArrayND[npc.integer]] ### diff --git a/scipy-stubs/sparse/_dok.pyi b/scipy-stubs/sparse/_dok.pyi index 067a01c9..6e91b5d3 100644 --- a/scipy-stubs/sparse/_dok.pyi +++ b/scipy-stubs/sparse/_dok.pyi @@ -16,6 +16,7 @@ from ._coo import coo_array, coo_matrix from ._index import IndexMixin from ._matrix import spmatrix from ._typing import _ToShape1D, _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["dok_array", "dok_matrix", "isspmatrix_dok"] @@ -33,7 +34,7 @@ _2D: TypeAlias = tuple[int, int] # noqa: PYI042 _NoD: TypeAlias = tuple[Never] | tuple[Never, Never] _AnyD: TypeAlias = tuple[Any, ...] -_ToMatrix: TypeAlias = _spbase[_ScalarT] | onp.CanArrayND[_ScalarT] | Sequence[onp.CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] +_ToMatrix: TypeAlias = _spbase[_ScalarT] | CanArrayND[_ScalarT] | Sequence[CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] _ToMatrixPy: TypeAlias = Sequence[_T] | Sequence[Sequence[_T]] _ToKey1D: TypeAlias = onp.ToJustInt | tuple[onp.ToJustInt] @@ -172,7 +173,7 @@ class dok_array(_dok_base[_ScalarT_co, _ShapeT_co], sparray[_ScalarT_co, _ShapeT def __init__( self, /, - arg1: _spbase[_ScalarT_co, _ShapeT_co] | onp.CanArrayND[_ScalarT_co, _ShapeT_co], + arg1: _spbase[_ScalarT_co, _ShapeT_co] | CanArrayND[_ScalarT_co, _ShapeT_co], shape: _ShapeT_co | None = None, dtype: onp.ToDType[_ScalarT_co] | None = None, copy: bool = False, @@ -194,7 +195,7 @@ class dok_array(_dok_base[_ScalarT_co, _ShapeT_co], sparray[_ScalarT_co, _ShapeT def __init__( self: dok_array[_ScalarT, _2D], /, - arg1: Sequence[Sequence[_ScalarT] | onp.CanArrayND[_ScalarT]], # assumes max. 2-d + arg1: Sequence[Sequence[_ScalarT] | CanArrayND[_ScalarT]], # assumes max. 2-d shape: _ToShape2D | None = None, dtype: onp.ToDType[_ScalarT] | None = None, copy: bool = False, @@ -512,7 +513,7 @@ class dok_array(_dok_base[_ScalarT_co, _ShapeT_co], sparray[_ScalarT_co, _ShapeT # @overload - def __getitem__(self, key: onp.CanArrayND[np.bool_ | npc.integer] | list[int] | slice, /) -> Self: ... + def __getitem__(self, key: CanArrayND[np.bool_ | npc.integer] | list[int] | slice, /) -> Self: ... @overload def __getitem__(self: dok_array[_ScalarT, _ShapeT], key: _spbase[np.bool_, _ShapeT], /) -> dok_array[_ScalarT, _ShapeT]: ... @overload @@ -704,7 +705,7 @@ class dok_matrix(_dok_base[_ScalarT_co, _2D], spmatrix[_ScalarT_co], Generic[_Sc # @overload def __getitem__( - self, key: _ToKey1D | onp.CanArrayND[np.bool_ | npc.integer] | _spbase[np.bool_, _2D] | list[int] | slice, / + self, key: _ToKey1D | CanArrayND[np.bool_ | npc.integer] | _spbase[np.bool_, _2D] | list[int] | slice, / ) -> Self: ... @overload def __getitem__(self, key: _ToKey2D, /) -> _ScalarT_co: ... # pyright: ignore[reportIncompatibleMethodOverride] diff --git a/scipy-stubs/sparse/_extract.pyi b/scipy-stubs/sparse/_extract.pyi index 8627b683..fbf6ee8d 100644 --- a/scipy-stubs/sparse/_extract.pyi +++ b/scipy-stubs/sparse/_extract.pyi @@ -16,13 +16,14 @@ from ._dok import dok_array, dok_matrix from ._lil import lil_array, lil_matrix from ._matrix import spmatrix from ._typing import _Format +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["find", "tril", "triu"] ### _SCT = TypeVar("_SCT", bound=npc.number | np.bool_, default=Any) -_ToDense: TypeAlias = onp.CanArrayND[_SCT] | Seq[_SCT] | Seq[Seq[_SCT] | onp.CanArrayND[_SCT]] +_ToDense: TypeAlias = CanArrayND[_SCT] | Seq[_SCT] | Seq[Seq[_SCT] | CanArrayND[_SCT]] ### diff --git a/scipy-stubs/sparse/_lil.pyi b/scipy-stubs/sparse/_lil.pyi index 7df8317d..d4c33aec 100644 --- a/scipy-stubs/sparse/_lil.pyi +++ b/scipy-stubs/sparse/_lil.pyi @@ -14,6 +14,7 @@ from ._csr import csr_array, csr_matrix from ._index import IndexMixin from ._matrix import spmatrix from ._typing import _ToShape2D +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["isspmatrix_lil", "lil_array", "lil_matrix"] @@ -22,7 +23,7 @@ _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) _ScalarT_co = TypeVar("_ScalarT_co", bound=npc.number | np.bool_, default=Any, covariant=True) _ToMatrixPy: TypeAlias = Sequence[_T] | Sequence[Sequence[_T]] -_ToMatrix: TypeAlias = _spbase[_ScalarT] | onp.CanArrayND[_ScalarT] | Sequence[onp.CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] +_ToMatrix: TypeAlias = _spbase[_ScalarT] | CanArrayND[_ScalarT] | Sequence[CanArrayND[_ScalarT]] | _ToMatrixPy[_ScalarT] ### diff --git a/scipy-stubs/sparse/_matrix.pyi b/scipy-stubs/sparse/_matrix.pyi index 0ef98676..27dd1640 100644 --- a/scipy-stubs/sparse/_matrix.pyi +++ b/scipy-stubs/sparse/_matrix.pyi @@ -20,6 +20,7 @@ from ._dia import dia_matrix from ._dok import dok_matrix from ._lil import lil_matrix from ._typing import _Format +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround _T = TypeVar("_T") _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) @@ -38,7 +39,7 @@ _ToFloat: TypeAlias = npc.floating | _ToInt _ToComplex64: TypeAlias = np.complex64 | _ToFloat _DualMatrixLike: TypeAlias = _T | _ScalarT | _spbase[_ScalarT] -_DualArrayLike: TypeAlias = Sequence[Sequence[_T | _ScalarT] | onp.CanArrayND[_ScalarT]] | onp.CanArrayND[_ScalarT] +_DualArrayLike: TypeAlias = Sequence[Sequence[_T | _ScalarT] | CanArrayND[_ScalarT]] | CanArrayND[_ScalarT] _SpMatrixOut: TypeAlias = bsr_matrix[_ScalarT] | csc_matrix[_ScalarT] | csr_matrix[_ScalarT] diff --git a/scipy-stubs/sparse/_sputils.pyi b/scipy-stubs/sparse/_sputils.pyi index 04c3da7c..e8328c20 100644 --- a/scipy-stubs/sparse/_sputils.pyi +++ b/scipy-stubs/sparse/_sputils.pyi @@ -8,6 +8,7 @@ import optype as op import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse import ( bsr_array, bsr_matrix, @@ -119,13 +120,13 @@ def get_index_dtype( ) -> type[np.int32]: ... @overload def get_index_dtype( - arrays: tuple[onp.CanArrayND[_CoInt32], *tuple[onp.CanArrayND[_CoInt32], ...]], + arrays: tuple[CanArrayND[_CoInt32], *tuple[CanArrayND[_CoInt32], ...]], maxval: onp.ToFloat | None = None, check_contents: op.CanBool = False, ) -> type[np.int32]: ... @overload def get_index_dtype( - arrays: tuple[onp.CanArrayND[_ContraInt32], *tuple[onp.CanArrayND[_ContraInt32], ...]], + arrays: tuple[CanArrayND[_ContraInt32], *tuple[CanArrayND[_ContraInt32], ...]], maxval: onp.ToFloat | None = None, check_contents: op.CanBool = False, ) -> type[np.int64]: ... diff --git a/scipy-stubs/sparse/csgraph/_min_spanning_tree.pyi b/scipy-stubs/sparse/csgraph/_min_spanning_tree.pyi index 03b43595..e812f943 100644 --- a/scipy-stubs/sparse/csgraph/_min_spanning_tree.pyi +++ b/scipy-stubs/sparse/csgraph/_min_spanning_tree.pyi @@ -5,11 +5,12 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse import csr_array from scipy.sparse._base import _spbase _RealT = TypeVar("_RealT", bound=npc.integer | npc.floating) -_Graph: TypeAlias = onp.CanArrayND[_RealT] | _spbase[_RealT, tuple[int, int]] +_Graph: TypeAlias = CanArrayND[_RealT] | _spbase[_RealT, tuple[int, int]] ### diff --git a/scipy-stubs/sparse/csgraph/_traversal.pyi b/scipy-stubs/sparse/csgraph/_traversal.pyi index 43c293d6..a59e2ac8 100644 --- a/scipy-stubs/sparse/csgraph/_traversal.pyi +++ b/scipy-stubs/sparse/csgraph/_traversal.pyi @@ -4,6 +4,7 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse import csr_array from scipy.sparse._base import _spbase @@ -16,7 +17,7 @@ _Int1D: TypeAlias = onp.Array1D[np.int32] _ToGraph: TypeAlias = onp.ToFloat2D | _spbase[_Real, tuple[int, int]] _RealT = TypeVar("_RealT", bound=_Real) -_Graph: TypeAlias = onp.CanArrayND[_RealT] | _spbase[_RealT, tuple[int, int]] +_Graph: TypeAlias = CanArrayND[_RealT] | _spbase[_RealT, tuple[int, int]] ### diff --git a/scipy-stubs/sparse/csgraph/_validation.pyi b/scipy-stubs/sparse/csgraph/_validation.pyi index cea353ea..6b3240dd 100644 --- a/scipy-stubs/sparse/csgraph/_validation.pyi +++ b/scipy-stubs/sparse/csgraph/_validation.pyi @@ -6,13 +6,14 @@ import numpy.typing as npt import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase _Real: TypeAlias = npc.integer | npc.floating _ToGraph: TypeAlias = onp.ToFloat2D | _spbase[_Real, tuple[int, int]] _RealT = TypeVar("_RealT", bound=_Real) -_Graph: TypeAlias = onp.CanArrayND[_RealT] | _spbase[_RealT, tuple[int, int]] +_Graph: TypeAlias = CanArrayND[_RealT] | _spbase[_RealT, tuple[int, int]] ### diff --git a/scipy-stubs/sparse/linalg/_interface.pyi b/scipy-stubs/sparse/linalg/_interface.pyi index bf784f4b..e8654d7d 100644 --- a/scipy-stubs/sparse/linalg/_interface.pyi +++ b/scipy-stubs/sparse/linalg/_interface.pyi @@ -9,6 +9,7 @@ import optype as op import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase __all__ = ["LinearOperator", "aslinearoperator"] @@ -523,7 +524,7 @@ class IdentityOperator(LinearOperator[_SCT_co], Generic[_SCT_co]): # @overload -def aslinearoperator(A: onp.CanArrayND[_InexactT]) -> MatrixLinearOperator[_InexactT]: ... +def aslinearoperator(A: CanArrayND[_InexactT]) -> MatrixLinearOperator[_InexactT]: ... @overload def aslinearoperator(A: _spbase[_InexactT]) -> MatrixLinearOperator[_InexactT]: ... @overload diff --git a/scipy-stubs/sparse/linalg/_isolve/_gcrotmk.pyi b/scipy-stubs/sparse/linalg/_isolve/_gcrotmk.pyi index 883b593e..e321a9a0 100644 --- a/scipy-stubs/sparse/linalg/_isolve/_gcrotmk.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/_gcrotmk.pyi @@ -6,6 +6,7 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator @@ -20,7 +21,7 @@ _ComplexT = TypeVar("_ComplexT", bound=_Complex, default=np.complex128) _NumericT = TypeVar("_NumericT", bound=npc.number | np.bool_) _ToInt: TypeAlias = npc.integer | np.bool_ -_ToLinearOperator: TypeAlias = onp.CanArrayND[_NumericT] | _spbase[_NumericT] | LinearOperator[_NumericT] +_ToLinearOperator: TypeAlias = CanArrayND[_NumericT] | _spbase[_NumericT] | LinearOperator[_NumericT] _Ignored: TypeAlias = object _Callback: TypeAlias = Callable[[onp.Array1D[_NumericT]], _Ignored] diff --git a/scipy-stubs/sparse/linalg/_isolve/iterative.pyi b/scipy-stubs/sparse/linalg/_isolve/iterative.pyi index 4817e286..a2b5f1cf 100644 --- a/scipy-stubs/sparse/linalg/_isolve/iterative.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/iterative.pyi @@ -6,6 +6,7 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator @@ -22,7 +23,7 @@ _FloatT = TypeVar("_FloatT", bound=_Float, default=np.float64) _ComplexT = TypeVar("_ComplexT", bound=_Complex) _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) -_ToLinearOperator: TypeAlias = onp.CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] +_ToLinearOperator: TypeAlias = CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] _Ignored: TypeAlias = object _Callback: TypeAlias = Callable[[onp.Array1D[_ScalarT]], _Ignored] diff --git a/scipy-stubs/sparse/linalg/_isolve/lgmres.pyi b/scipy-stubs/sparse/linalg/_isolve/lgmres.pyi index 163f4173..c9055a6c 100644 --- a/scipy-stubs/sparse/linalg/_isolve/lgmres.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/lgmres.pyi @@ -6,6 +6,7 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator @@ -19,7 +20,7 @@ _ComplexT = TypeVar("_ComplexT", bound=_Complex, default=np.complex128) _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) _ToInt: TypeAlias = npc.integer | np.bool_ -_ToLinearOperator: TypeAlias = onp.CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] +_ToLinearOperator: TypeAlias = CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] _Ignored: TypeAlias = object _Callback: TypeAlias = Callable[[onp.Array1D[_ScalarT]], _Ignored] diff --git a/scipy-stubs/sparse/linalg/_isolve/lsmr.pyi b/scipy-stubs/sparse/linalg/_isolve/lsmr.pyi index 6edc281a..b4d93701 100644 --- a/scipy-stubs/sparse/linalg/_isolve/lsmr.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/lsmr.pyi @@ -4,13 +4,14 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator __all__ = ["lsmr"] _Real: TypeAlias = np.bool_ | npc.integer | np.floating -_ToRealMatrix: TypeAlias = onp.CanArrayND[_Real] | _spbase[_Real] | LinearOperator[_Real] +_ToRealMatrix: TypeAlias = CanArrayND[_Real] | _spbase[_Real] | LinearOperator[_Real] _IStop: TypeAlias = Literal[0, 1, 2, 3, 4, 5, 6, 7] diff --git a/scipy-stubs/sparse/linalg/_isolve/lsqr.pyi b/scipy-stubs/sparse/linalg/_isolve/lsqr.pyi index 50836785..4138e9f9 100644 --- a/scipy-stubs/sparse/linalg/_isolve/lsqr.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/lsqr.pyi @@ -4,13 +4,14 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator __all__ = ["lsqr"] _Real: TypeAlias = np.bool_ | npc.integer | np.floating -_ToRealMatrix: TypeAlias = onp.CanArrayND[_Real] | _spbase[_Real] | LinearOperator[_Real] +_ToRealMatrix: TypeAlias = CanArrayND[_Real] | _spbase[_Real] | LinearOperator[_Real] _IStop: TypeAlias = Literal[0, 1, 2, 3, 4, 5, 6, 7] diff --git a/scipy-stubs/sparse/linalg/_isolve/minres.pyi b/scipy-stubs/sparse/linalg/_isolve/minres.pyi index d5af717b..daa85552 100644 --- a/scipy-stubs/sparse/linalg/_isolve/minres.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/minres.pyi @@ -6,6 +6,7 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator @@ -16,7 +17,7 @@ _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) _Ignored: TypeAlias = object _ToInt: TypeAlias = npc.integer | np.bool_ -_ToLinearOperator: TypeAlias = onp.CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] +_ToLinearOperator: TypeAlias = CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] ### diff --git a/scipy-stubs/sparse/linalg/_isolve/tfqmr.pyi b/scipy-stubs/sparse/linalg/_isolve/tfqmr.pyi index 45f25146..c2e19cc3 100644 --- a/scipy-stubs/sparse/linalg/_isolve/tfqmr.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/tfqmr.pyi @@ -6,6 +6,7 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator @@ -15,7 +16,7 @@ _FloatT = TypeVar("_FloatT", bound=np.float32 | np.float64, default=np.float64) _ComplexT = TypeVar("_ComplexT", bound=np.complex64 | np.complex128, default=np.complex128) _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) -_ToLinearOperator: TypeAlias = onp.CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] +_ToLinearOperator: TypeAlias = CanArrayND[_ScalarT] | _spbase[_ScalarT] | LinearOperator[_ScalarT] _Ignored: TypeAlias = object _Callback: TypeAlias = Callable[[onp.Array1D[_ScalarT]], _Ignored] diff --git a/scipy-stubs/sparse/linalg/_isolve/utils.pyi b/scipy-stubs/sparse/linalg/_isolve/utils.pyi index 72e3c9c5..f57d5eda 100644 --- a/scipy-stubs/sparse/linalg/_isolve/utils.pyi +++ b/scipy-stubs/sparse/linalg/_isolve/utils.pyi @@ -5,6 +5,7 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.sparse._base import _spbase from scipy.sparse.linalg import LinearOperator @@ -12,7 +13,7 @@ __all__: list[str] = [] _T = TypeVar("_T") _Char: TypeAlias = Literal["f", "d", "F", "D"] -_ToLinearOperator: TypeAlias = onp.CanArrayND[npc.number | np.bool_] | _spbase | LinearOperator +_ToLinearOperator: TypeAlias = CanArrayND[npc.number | np.bool_] | _spbase | LinearOperator _Inexact: TypeAlias = np.float32 | np.float64 | np.complex64 | np.complex128 ### From a3c27e39fbb32fa3c3bbd1f331d254ad9c2abfc4 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sun, 13 Jul 2025 01:20:20 +0200 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=A4=A1=20`special`:=20use=20`CanArray?= =?UTF-8?q?ND`=20from=20`scipy.=5Ftyping`=20instead=20of=20`optype.numpy`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scipy-stubs/special/_basic.pyi | 3 ++- scipy-stubs/special/_logsumexp.pyi | 32 ++++++++++++++++------------ scipy-stubs/special/_multiufuncs.pyi | 6 ++++-- scipy-stubs/special/_ufuncs.pyi | 8 +++++-- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/scipy-stubs/special/_basic.pyi b/scipy-stubs/special/_basic.pyi index 157803e8..c3add4bd 100644 --- a/scipy-stubs/special/_basic.pyi +++ b/scipy-stubs/special/_basic.pyi @@ -7,6 +7,7 @@ import optype.numpy as onp import optype.numpy.compat as npc from ._ufuncs import _KwBase, psi as digamma +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = [ "ai_zeros", @@ -535,7 +536,7 @@ def softplus( ) -> _f8_nd: ... @overload def softplus( - x: onp.CanArrayND[_SCT_f, _ShapeT], *, out: None = None, dtype: onp.ToDType[_SCT_f] | None = None, **kwds: Unpack[_KwBase] + x: CanArrayND[_SCT_f, _ShapeT], *, out: None = None, dtype: onp.ToDType[_SCT_f] | None = None, **kwds: Unpack[_KwBase] ) -> onp.ArrayND[_SCT_f, _ShapeT]: ... @overload def softplus( diff --git a/scipy-stubs/special/_logsumexp.pyi b/scipy-stubs/special/_logsumexp.pyi index 469918a7..268dcd52 100644 --- a/scipy-stubs/special/_logsumexp.pyi +++ b/scipy-stubs/special/_logsumexp.pyi @@ -1,10 +1,14 @@ from typing import Any, TypeVar, overload import numpy as np +import optype as op import optype.numpy as onp import optype.numpy.compat as npc -from scipy._typing import AnyShape +from scipy._typing import ( + AnyShape, + CanArrayND, # path-dependent Pyright bug workaround +) __all__ = ["log_softmax", "logsumexp", "softmax"] @@ -17,7 +21,7 @@ _InexactOrArrayT = TypeVar("_InexactOrArrayT", bound=npc.inexact | onp.ArrayND[n @overload # 0d/nd T, axis=None (default), keepdims=False (default) def logsumexp( - a: _InexactT | onp.ToArrayND[_InexactT, _InexactT], + a: _InexactT | onp.CanArray[Any, np.dtype[_InexactT]], axis: None = None, b: onp.ToComplex | onp.ToComplexND | None = None, keepdims: onp.ToFalse = False, @@ -41,7 +45,7 @@ def logsumexp( ) -> np.complex128: ... @overload # 0d/nd T, keepdims=True def logsumexp( - a: _InexactT | onp.ToArrayND[_InexactT, _InexactT], + a: _InexactT | onp.CanArray[Any, np.dtype[_InexactT]], axis: AnyShape | None = None, b: onp.ToComplex | onp.ToComplexND | None = None, *, @@ -68,7 +72,7 @@ def logsumexp( ) -> onp.ArrayND[np.complex128]: ... @overload # 0d/nd T, axis= def logsumexp( - a: _InexactT | onp.ToArrayND[_InexactT, _InexactT], + a: _InexactT | onp.CanArray[Any, np.dtype[_InexactT]], axis: AnyShape, b: onp.ToComplex | onp.ToComplexND | None = None, *, @@ -109,7 +113,7 @@ def logsumexp( ) -> onp.ArrayND[np.complex128 | Any] | Any: ... @overload # 0d/nd T@floating, axis=None (default), keepdims=False (default), return_sign=True def logsumexp( - a: _FloatingT | onp.ToArrayND[_FloatingT, _FloatingT], + a: _FloatingT | onp.CanArray[Any, np.dtype[_FloatingT]], axis: None = None, b: onp.ToFloat | onp.ToFloatND | None = None, keepdims: onp.ToFalse = False, @@ -136,7 +140,7 @@ def logsumexp( ) -> tuple[np.float64, np.complex128]: ... @overload # 0d/nd T@complexfloating, axis=None (default), keepdims=False (default), return_sign=True def logsumexp( - a: _CFloatingT | onp.ToArrayND[_CFloatingT, _CFloatingT], + a: _CFloatingT | onp.CanArray[Any, np.dtype[_CFloatingT]], axis: None = None, b: onp.ToFloat | onp.ToFloatND | None = None, keepdims: onp.ToFalse = False, @@ -145,7 +149,7 @@ def logsumexp( ) -> tuple[npc.floating, _CFloatingT]: ... @overload # 0d/nd T@floatinv, keepdims=True, return_sign=True def logsumexp( - a: _FloatingT | onp.ToArrayND[_FloatingT, _FloatingT], + a: _FloatingT | onp.CanArray[Any, np.dtype[_FloatingT]], axis: AnyShape | None = None, b: onp.ToFloat | onp.ToFloatND | None = None, *, @@ -172,7 +176,7 @@ def logsumexp( ) -> tuple[onp.ArrayND[np.float64], onp.ArrayND[np.complex128]]: ... @overload # 0d/nd T@complexfloating, keepdims=True, return_sign=True def logsumexp( - a: _CFloatingT | onp.ToArrayND[_CFloatingT, _CFloatingT], + a: _CFloatingT | onp.CanArray[Any, np.dtype[_CFloatingT]], axis: AnyShape | None = None, b: onp.ToComplex | onp.ToComplexND | None = None, *, @@ -181,7 +185,7 @@ def logsumexp( ) -> tuple[onp.ArrayND[npc.floating], onp.ArrayND[_CFloatingT]]: ... @overload # 0d/nd T@floatinv, axis=, return_sign=True def logsumexp( - a: _FloatingT | onp.ToArrayND[_FloatingT, _FloatingT], + a: _FloatingT | onp.CanArray[Any, np.dtype[_FloatingT]], axis: AnyShape, b: onp.ToFloat | onp.ToFloatND | None = None, keepdims: onp.ToFalse = False, @@ -208,7 +212,7 @@ def logsumexp( ) -> tuple[onp.ArrayND[np.float64] | Any, onp.ArrayND[np.complex128] | Any]: ... @overload # 0d/nd T@complexfloating, axis=, return_sign=True def logsumexp( - a: _CFloatingT | onp.ToArrayND[_CFloatingT, _CFloatingT], + a: _CFloatingT | onp.CanArray[Any, np.dtype[_CFloatingT]], axis: AnyShape, b: onp.ToComplex | onp.ToComplexND | None = None, keepdims: onp.ToFalse = False, @@ -242,7 +246,7 @@ def softmax(x: onp.ToInt | onp.ToJustFloat64, axis: AnyShape | None = None) -> n @overload # 0d ~complex128 def softmax(x: onp.ToJustComplex128, axis: AnyShape | None = None) -> np.complex128: ... @overload # nd T@inexact -def softmax(x: onp.ToArrayND[_InexactT, _InexactT], axis: AnyShape | None = None) -> onp.ArrayND[_InexactT]: ... +def softmax(x: CanArrayND[_InexactT], axis: AnyShape | None = None) -> onp.ArrayND[_InexactT]: ... @overload # nd +float64 def softmax(x: onp.ToIntND | onp.ToJustFloat64_ND, axis: AnyShape | None = None) -> onp.ArrayND[np.float64]: ... @overload # nd ~complex128 @@ -260,11 +264,11 @@ def softmax(x: onp.ToComplexND, axis: AnyShape | None = None) -> onp.ArrayND[np. @overload # T def log_softmax(x: _InexactOrArrayT, axis: AnyShape | None = None) -> _InexactOrArrayT: ... # type: ignore[overload-overlap] @overload # 0d +float64 -def log_softmax(x: onp.ToInt | onp.ToJustFloat64, axis: AnyShape | None = None) -> np.float64: ... +def log_softmax(x: float, axis: AnyShape | None = None) -> np.float64: ... @overload # 0d ~complex128 -def log_softmax(x: onp.ToJustComplex128, axis: AnyShape | None = None) -> np.complex128: ... +def log_softmax(x: op.JustComplex, axis: AnyShape | None = None) -> np.complex128: ... @overload # nd T@inexact -def log_softmax(x: onp.ToArrayND[_InexactT, _InexactT], axis: AnyShape | None = None) -> onp.ArrayND[_InexactT]: ... +def log_softmax(x: CanArrayND[_InexactT], axis: AnyShape | None = None) -> onp.ArrayND[_InexactT]: ... @overload # nd +float64 def log_softmax(x: onp.ToIntND | onp.ToJustFloat64_ND, axis: AnyShape | None = None) -> onp.ArrayND[np.float64]: ... @overload # nd ~complex128 diff --git a/scipy-stubs/special/_multiufuncs.pyi b/scipy-stubs/special/_multiufuncs.pyi index c8d8d07d..8d203f73 100644 --- a/scipy-stubs/special/_multiufuncs.pyi +++ b/scipy-stubs/special/_multiufuncs.pyi @@ -7,6 +7,8 @@ import optype as op import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround + __all__ = [ "assoc_legendre_p", "assoc_legendre_p_all", @@ -24,7 +26,7 @@ _UFuncT_co = TypeVar("_UFuncT_co", bound=Callable[..., object], default=Callable _Complex: TypeAlias = np.complex64 | np.complex128 # `clongdouble` isn't supported _ToJustComplex: TypeAlias = op.JustComplex | _Complex -_ToJustComplexND: TypeAlias = onp.CanArrayND[_Complex] | onp.SequenceND[onp.CanArrayND[_Complex]] | onp.SequenceND[_ToJustComplex] +_ToJustComplexND: TypeAlias = CanArrayND[_Complex] | onp.SequenceND[CanArrayND[_Complex]] | onp.SequenceND[_ToJustComplex] _ToJustComplex_D: TypeAlias = _ToJustComplex | _ToJustComplexND _ToInt_D: TypeAlias = onp.ToInt | onp.ToIntND @@ -56,7 +58,7 @@ _Complex33_D: TypeAlias = tuple[_Complex3_D, _Complex3_D] _Complex333_D: TypeAlias = tuple[_Complex3_D, _Complex3_D, _Complex3_D] _Branch: TypeAlias = L[2, 3] -_Branch_D: TypeAlias = _Branch | onp.SequenceND[_Branch] | onp.CanArrayND[npc.integer] +_Branch_D: TypeAlias = _Branch | onp.SequenceND[_Branch] | CanArrayND[npc.integer] _D0: TypeAlias = L[False, 0] _D1: TypeAlias = L[True, 1] diff --git a/scipy-stubs/special/_ufuncs.pyi b/scipy-stubs/special/_ufuncs.pyi index bf7d591d..fe5c2fe7 100644 --- a/scipy-stubs/special/_ufuncs.pyi +++ b/scipy-stubs/special/_ufuncs.pyi @@ -11,7 +11,11 @@ import optype.numpy as onp import optype.numpy.compat as npc from numpy.exceptions import ComplexWarning -from scipy._typing import AnyShape, ExitMixin +from scipy._typing import ( + AnyShape, + CanArrayND, # path-dependent Pyright bug workaround + ExitMixin, +) __all__ = [ "agm", @@ -322,7 +326,7 @@ _ToSubComplex: TypeAlias = op.JustComplex | _ToSubFloat # does not overlap with _CoT = TypeVar("_CoT", bound=np.generic) _ToT = TypeVar("_ToT") -_ToND: TypeAlias = onp.CanArrayND[_CoT] | onp.SequenceND[onp.CanArrayND[_CoT]] | onp.SequenceND[_ToT] +_ToND: TypeAlias = CanArrayND[_CoT] | onp.SequenceND[CanArrayND[_CoT]] | onp.SequenceND[_ToT] _ToFloat32 = TypeAliasType("_ToFloat32", int | _Float32 | _SubFloat) _ToFloat64OrND: TypeAlias = onp.ToFloat64 | onp.ToFloat64_ND From da50060755d53a7c6ac032a1907710d4bba06951 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sun, 13 Jul 2025 01:56:41 +0200 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=A4=A1=20`stats`:=20use=20`CanArrayND?= =?UTF-8?q?`=20from=20`scipy.=5Ftyping`=20instead=20of=20`optype.numpy`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scipy-stubs/stats/_distn_infrastructure.pyi | 29 +++++----- .../stats/_distribution_infrastructure.pyi | 15 +++--- scipy-stubs/stats/_entropy.pyi | 53 +++++++++++-------- scipy-stubs/stats/_morestats.pyi | 5 +- scipy-stubs/stats/_multivariate.pyi | 9 ++-- scipy-stubs/stats/_new_distributions.pyi | 9 ++-- scipy-stubs/stats/_stats_py.pyi | 3 +- scipy-stubs/stats/_tukeylambda_stats.pyi | 6 ++- 8 files changed, 73 insertions(+), 56 deletions(-) diff --git a/scipy-stubs/stats/_distn_infrastructure.pyi b/scipy-stubs/stats/_distn_infrastructure.pyi index a3b2a5d0..376f5278 100644 --- a/scipy-stubs/stats/_distn_infrastructure.pyi +++ b/scipy-stubs/stats/_distn_infrastructure.pyi @@ -13,7 +13,10 @@ import optype as op import optype.numpy as onp import optype.numpy.compat as npc -from scipy._typing import AnyShape +from scipy._typing import ( + AnyShape, + CanArrayND, # path-dependent Pyright bug workaround +) from scipy.integrate._typing import QuadOpts as _QuadOpts _T = TypeVar("_T") @@ -484,7 +487,7 @@ class rv_continuous(_rv_mixin, rv_generic): def pdf( self, /, - x: onp.CanArrayND[_CoFloat, _ShapeT], + x: CanArrayND[_CoFloat, _ShapeT], *args: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1, @@ -504,7 +507,7 @@ class rv_continuous(_rv_mixin, rv_generic): def logpdf( self, /, - x: onp.CanArrayND[_CoFloat, _ShapeT], + x: CanArrayND[_CoFloat, _ShapeT], *args: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1, @@ -524,7 +527,7 @@ class rv_continuous(_rv_mixin, rv_generic): def cdf( self, /, - x: onp.CanArrayND[_CoFloat, _ShapeT], + x: CanArrayND[_CoFloat, _ShapeT], *args: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1, @@ -544,7 +547,7 @@ class rv_continuous(_rv_mixin, rv_generic): def logcdf( self, /, - x: onp.CanArrayND[_CoFloat, _ShapeT], + x: CanArrayND[_CoFloat, _ShapeT], *args: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1, @@ -564,7 +567,7 @@ class rv_continuous(_rv_mixin, rv_generic): def sf( self, /, - x: onp.CanArrayND[_CoFloat, _ShapeT], + x: CanArrayND[_CoFloat, _ShapeT], *args: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1, @@ -584,7 +587,7 @@ class rv_continuous(_rv_mixin, rv_generic): def logsf( self, /, - x: onp.CanArrayND[_CoFloat, _ShapeT], + x: CanArrayND[_CoFloat, _ShapeT], *args: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1, @@ -1058,7 +1061,7 @@ class _rv_continuous_0(rv_continuous): def pdf(self, /, x: onp.ToFloat, loc: onp.ToFloatND, scale: _ToFloatOrND) -> _FloatND: ... @overload def pdf( - self, /, x: onp.CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 + self, /, x: CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 ) -> onp.Array[_ShapeT, np.float64]: ... @overload def pdf(self, /, x: onp.ToFloatND, loc: _ToFloatOrND = 0, scale: _ToFloatOrND = 1) -> _FloatND: ... @@ -1071,7 +1074,7 @@ class _rv_continuous_0(rv_continuous): def logpdf(self, /, x: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1) -> _Float: ... @overload def logpdf( - self, /, x: onp.CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 + self, /, x: CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 ) -> onp.Array[_ShapeT, np.float64]: ... @overload def logpdf(self, /, x: _ToFloatOrND, loc: _ToFloatOrND = 0, scale: _ToFloatOrND = 1) -> _FloatOrND: ... @@ -1082,7 +1085,7 @@ class _rv_continuous_0(rv_continuous): def cdf(self, /, x: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1) -> _Float: ... @overload def cdf( - self, /, x: onp.CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 + self, /, x: CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 ) -> onp.Array[_ShapeT, np.float64]: ... @overload def cdf(self, /, x: _ToFloatOrND, loc: _ToFloatOrND = 0, scale: _ToFloatOrND = 1) -> _FloatOrND: ... @@ -1093,7 +1096,7 @@ class _rv_continuous_0(rv_continuous): def logcdf(self, /, x: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1) -> _Float: ... @overload def logcdf( - self, /, x: onp.CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 + self, /, x: CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 ) -> onp.Array[_ShapeT, np.float64]: ... @overload def logcdf(self, /, x: _ToFloatOrND, loc: _ToFloatOrND = 0, scale: _ToFloatOrND = 1) -> _FloatOrND: ... @@ -1104,7 +1107,7 @@ class _rv_continuous_0(rv_continuous): def sf(self, /, x: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1) -> _Float: ... @overload def sf( - self, /, x: onp.CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 + self, /, x: CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 ) -> onp.Array[_ShapeT, np.float64]: ... @overload def sf(self, /, x: _ToFloatOrND, loc: _ToFloatOrND = 0, scale: _ToFloatOrND = 1) -> _FloatOrND: ... @@ -1115,7 +1118,7 @@ class _rv_continuous_0(rv_continuous): def logsf(self, /, x: onp.ToFloat, loc: onp.ToFloat = 0, scale: onp.ToFloat = 1) -> _Float: ... @overload def logsf( - self, /, x: onp.CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 + self, /, x: CanArrayND[_CoFloat, _ShapeT], loc: onp.ToFloat = 0, scale: onp.ToFloat = 1 ) -> onp.Array[_ShapeT, np.float64]: ... @overload def logsf(self, /, x: _ToFloatOrND, loc: _ToFloatOrND = 0, scale: _ToFloatOrND = 1) -> _FloatOrND: ... diff --git a/scipy-stubs/stats/_distribution_infrastructure.pyi b/scipy-stubs/stats/_distribution_infrastructure.pyi index 9565293c..e8abfbcb 100644 --- a/scipy-stubs/stats/_distribution_infrastructure.pyi +++ b/scipy-stubs/stats/_distribution_infrastructure.pyi @@ -27,6 +27,7 @@ import optype.numpy.compat as npc from ._distn_infrastructure import rv_continuous from ._probability_distribution import _ProbabilityDistribution from ._qmc import QMCEngine +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["Mixture", "abs", "exp", "log", "make_distribution", "order_statistic", "truncate"] @@ -294,7 +295,7 @@ _FloatND: TypeAlias = onp.ArrayND[_Float, _ShapeT1] _Complex: TypeAlias = np.complex128 | np.clongdouble _ComplexND: TypeAlias = onp.ArrayND[_Complex, _ShapeT1] -_ToFloatND: TypeAlias = onp.CanArrayND[npc.floating | npc.integer | np.bool_, _ShapeT1] +_ToFloatND: TypeAlias = CanArrayND[npc.floating | npc.integer | np.bool_, _ShapeT1] _ToFloat0ND: TypeAlias = onp.ToFloat | onp.ToFloatND _ToFloatMaxND: TypeAlias = _ToFloatND[_ShapeT1] | _ToFloatMax1D @@ -1217,7 +1218,7 @@ class UnivariateDistribution(_BaseDistribution[_XT_co], Generic[_XT_co, _ShapeT0 @overload def __add__(self, x: onp.ToFloat, /) -> _LinDist[Self, _Float, _ShapeT_co]: ... @overload - def __add__(self: _DistT0, x: onp.CanArrayND[_FloatT, _ShapeT1], /) -> _LinDist[_DistT0, _FloatT | _FloatT_co, _ShapeT1]: ... + def __add__(self: _DistT0, x: CanArrayND[_FloatT, _ShapeT1], /) -> _LinDist[_DistT0, _FloatT | _FloatT_co, _ShapeT1]: ... @overload def __add__(self: _DistT_1, x: onp.ToFloatStrict1D, /) -> _LinDist[_DistT_1, _Float, _1D]: ... @overload @@ -1236,9 +1237,7 @@ class UnivariateDistribution(_BaseDistribution[_XT_co], Generic[_XT_co, _ShapeT0 @overload def __sub__(self, lshift: onp.ToFloat, /) -> _LinDist[Self, _Float, _ShapeT_co]: ... @overload - def __sub__( - self: _DistT0, lshift: onp.CanArrayND[_FloatT, _ShapeT1], / - ) -> _LinDist[_DistT0, _FloatT | _FloatT_co, _ShapeT1]: ... + def __sub__(self: _DistT0, lshift: CanArrayND[_FloatT, _ShapeT1], /) -> _LinDist[_DistT0, _FloatT | _FloatT_co, _ShapeT1]: ... @overload def __sub__(self: _DistT_1, lshift: onp.ToFloatStrict1D, /) -> _LinDist[_DistT_1, _Float, _1D]: ... @overload @@ -1257,9 +1256,7 @@ class UnivariateDistribution(_BaseDistribution[_XT_co], Generic[_XT_co, _ShapeT0 @overload def __mul__(self, scale: onp.ToFloat, /) -> _LinDist[Self, _Float, _ShapeT_co]: ... @overload - def __mul__( - self: _DistT0, scale: onp.CanArrayND[_FloatT, _ShapeT1], / - ) -> _LinDist[_DistT0, _FloatT | _FloatT_co, _ShapeT1]: ... + def __mul__(self: _DistT0, scale: CanArrayND[_FloatT, _ShapeT1], /) -> _LinDist[_DistT0, _FloatT | _FloatT_co, _ShapeT1]: ... @overload def __mul__(self: _DistT_1, scale: onp.ToFloatStrict1D, /) -> _LinDist[_DistT_1, _Float, _1D]: ... @overload @@ -1283,7 +1280,7 @@ class UnivariateDistribution(_BaseDistribution[_XT_co], Generic[_XT_co, _ShapeT0 def __truediv__(self, iscale: onp.ToFloat, /) -> _LinDist[Self, _Float, _ShapeT_co]: ... @overload def __truediv__( - self: _DistT0, iscale: onp.CanArrayND[_FloatT, _ShapeT1], / + self: _DistT0, iscale: CanArrayND[_FloatT, _ShapeT1], / ) -> _LinDist[_DistT0, _FloatT | _FloatT_co, _ShapeT1]: ... @overload def __truediv__(self: _DistT_1, iscale: onp.ToFloatStrict1D, /) -> _LinDist[_DistT_1, _Float, _1D]: ... diff --git a/scipy-stubs/stats/_entropy.pyi b/scipy-stubs/stats/_entropy.pyi index e91b74c4..75788e2f 100644 --- a/scipy-stubs/stats/_entropy.pyi +++ b/scipy-stubs/stats/_entropy.pyi @@ -1,37 +1,46 @@ -from typing import Literal, TypeAlias, overload -from typing_extensions import TypeAliasType, TypeVar +from collections.abc import Sequence +from typing import Any, Literal, Protocol, TypeAlias, TypeVar, overload, type_check_only +from typing_extensions import TypeAliasType import numpy as np import optype.numpy as onp import optype.numpy.compat as npc from ._typing import NanPolicy +from scipy._typing import CanArrayND __all__ = ["differential_entropy", "entropy"] -_InexactT = TypeVar("_InexactT", bound=npc.inexact) +_ScalarT_co = TypeVar("_ScalarT_co", bound=np.generic, covariant=True) +_ShapeT_co = TypeVar("_ShapeT_co", bound=tuple[int, ...], covariant=True) + +@type_check_only +class _CanArray(Protocol[_ScalarT_co, _ShapeT_co]): + def __array__(self, /) -> np.ndarray[_ShapeT_co, np.dtype[_ScalarT_co]]: ... + _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) +_InexactT = TypeVar("_InexactT", bound=npc.inexact) _PyScalarT = TypeVar("_PyScalarT") -_AsF32: TypeAlias = np.float16 | np.float32 +_AsF32: TypeAlias = np.float32 | np.float16 _AsF64: TypeAlias = np.float64 | npc.integer | np.bool_ _DifferentialMethod: TypeAlias = Literal["vasicek", "van es", "ebrahimi", "correa", "auto"] _ToArrayMaxND = TypeAliasType( - "_ToArrayMaxND", onp.ToArrayND[_PyScalarT, _ScalarT] | _PyScalarT | _ScalarT, type_params=(_ScalarT, _PyScalarT) + "_ToArrayMaxND", _CanArray[_ScalarT, Any] | onp.SequenceND[_PyScalarT] | _PyScalarT, type_params=(_ScalarT, _PyScalarT) ) _ToArrayMax1D = TypeAliasType( - "_ToArrayMax1D", onp.ToArrayStrict1D[_PyScalarT, _ScalarT] | _PyScalarT | _ScalarT, type_params=(_ScalarT, _PyScalarT) + "_ToArrayMax1D", _CanArray[_ScalarT, onp.AtMost1D] | Sequence[_PyScalarT] | _PyScalarT, type_params=(_ScalarT, _PyScalarT) ) _ToArrayMax2D = TypeAliasType( "_ToArrayMax2D", - onp.ToArrayStrict2D[_PyScalarT, _ScalarT] | _ToArrayMax1D[_ScalarT, _PyScalarT], + _CanArray[_ScalarT, onp.AtMost2D] | Sequence[Sequence[_PyScalarT] | _PyScalarT] | _PyScalarT, type_params=(_ScalarT, _PyScalarT), ) _ToArrayMax3D = TypeAliasType( "_ToArrayMax3D", - onp.ToArrayStrict3D[_PyScalarT, _ScalarT] | _ToArrayMax2D[_ScalarT, _PyScalarT], + _CanArray[_ScalarT, onp.AtMost3D] | Sequence[Sequence[Sequence[_PyScalarT] | _PyScalarT] | _PyScalarT] | _PyScalarT, type_params=(_ScalarT, _PyScalarT), ) @@ -222,8 +231,8 @@ def entropy( ) -> np.float64 | onp.ArrayND[np.float64]: ... @overload # Nd float32 | float16, axis=None (positional) -> 0d float32 def entropy( - pk: _ToArrayMaxND[_AsF32, np.float32], - qk: _ToArrayMaxND[_AsF32, np.float32] | None, + pk: _CanArray[_AsF32, Any], + qk: _CanArray[_AsF32, Any] | None, base: float | None, axis: None, *, @@ -232,8 +241,8 @@ def entropy( ) -> np.float32: ... @overload # Nd float32 | float16, axis=None (keyword) -> 0d float32 def entropy( - pk: _ToArrayMaxND[_AsF32, np.float32], - qk: _ToArrayMaxND[_AsF32, np.float32] | None = None, + pk: _CanArray[_AsF32, Any], + qk: _CanArray[_AsF32, Any] | None = None, base: float | None = None, *, axis: None, @@ -292,8 +301,8 @@ def entropy( ) -> onp.Array2D[np.float32]: ... @overload # Nd float32 | float16, keepdims=True -> Nd float32 def entropy( - pk: _ToArrayMaxND[_AsF32, np.float32], - qk: _ToArrayMaxND[_AsF32, np.float32] | None = None, + pk: _CanArray[_AsF32, Any], + qk: _CanArray[_AsF32, Any] | None = None, base: float | None = None, axis: int = 0, *, @@ -302,8 +311,8 @@ def entropy( ) -> onp.ArrayND[np.float32]: ... @overload # Nd float32 | float16 -> 0d float32 | Nd float32 def entropy( - pk: _ToArrayMaxND[_AsF32, np.float32], - qk: _ToArrayMaxND[_AsF32, np.float32] | None = None, + pk: _CanArray[_AsF32, Any], + qk: _CanArray[_AsF32, Any] | None = None, base: float | None = None, axis: int = 0, *, @@ -324,7 +333,7 @@ def entropy( # @overload # Nd known inexact dtype, axis=None def differential_entropy( - values: _ToArrayMaxND[_InexactT, _InexactT], + values: _CanArray[_InexactT, Any], *, window_length: int | None = None, base: float | None = None, @@ -335,7 +344,7 @@ def differential_entropy( ) -> _InexactT: ... @overload # 0d or 1d known inexact dtype def differential_entropy( - values: _ToArrayMax1D[_InexactT, _InexactT], + values: _CanArray[_InexactT, onp.AtMost1D], *, window_length: int | None = None, base: float | None = None, @@ -346,7 +355,7 @@ def differential_entropy( ) -> _InexactT: ... @overload # 2d known inexact dtype def differential_entropy( - values: onp.ToArrayStrict2D[_InexactT, _InexactT], + values: _CanArray[_InexactT, tuple[int, int]], *, window_length: int | None = None, base: float | None = None, @@ -357,7 +366,7 @@ def differential_entropy( ) -> onp.Array1D[_InexactT]: ... @overload # 2d known inexact dtype def differential_entropy( - values: onp.ToArrayStrict3D[_InexactT, _InexactT], + values: _CanArray[_InexactT, tuple[int, int, int]], *, window_length: int | None = None, base: float | None = None, @@ -368,7 +377,7 @@ def differential_entropy( ) -> onp.Array2D[_InexactT]: ... @overload # Nd known inexact dtype, keepdims=True def differential_entropy( - values: onp.ToArrayND[_InexactT, _InexactT], + values: CanArrayND[_InexactT], *, window_length: int | None = None, base: float | None = None, @@ -379,7 +388,7 @@ def differential_entropy( ) -> onp.ArrayND[_InexactT]: ... @overload # Nd known inexact dtype def differential_entropy( - values: onp.ToArrayND[_InexactT, _InexactT], + values: CanArrayND[_InexactT], *, window_length: int | None = None, base: float | None = None, diff --git a/scipy-stubs/stats/_morestats.pyi b/scipy-stubs/stats/_morestats.pyi index 387c833d..4218d411 100644 --- a/scipy-stubs/stats/_morestats.pyi +++ b/scipy-stubs/stats/_morestats.pyi @@ -13,6 +13,7 @@ from ._fit import FitResult from ._resampling import PermutationMethod from ._stats_py import SignificanceResult from ._typing import Alternative, BaseBunch, NanPolicy +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround from scipy.optimize import OptimizeResult __all__ = [ @@ -398,7 +399,7 @@ def boxcox_llf( # type: ignore[overload-overlap] @overload def boxcox_llf( # type: ignore[overload-overlap] lmb: float | onp.ToInt | _InexactT, - data: onp.CanArrayND[_InexactT] | Sequence[_InexactT], + data: CanArrayND[_InexactT] | Sequence[_InexactT], *, axis: None, keepdims: Literal[False] = False, @@ -407,7 +408,7 @@ def boxcox_llf( # type: ignore[overload-overlap] @overload def boxcox_llf( # type: ignore[overload-overlap] lmb: float | onp.ToInt | _InexactT, - data: onp.CanArrayND[_InexactT] | Sequence[_InexactT], + data: CanArrayND[_InexactT] | Sequence[_InexactT], *, axis: int | None = 0, keepdims: Literal[True], diff --git a/scipy-stubs/stats/_multivariate.pyi b/scipy-stubs/stats/_multivariate.pyi index d0396d0a..da9570a3 100644 --- a/scipy-stubs/stats/_multivariate.pyi +++ b/scipy-stubs/stats/_multivariate.pyi @@ -8,7 +8,10 @@ import optype.numpy.compat as npc import optype.typing as opt from ._covariance import _PSD, Covariance -from scipy._typing import AnyShape +from scipy._typing import ( + AnyShape, + CanArrayND, # path-dependent Pyright bug workaround +) __all__ = [ "dirichlet", @@ -38,9 +41,9 @@ _Scalar_uif: TypeAlias = npc.integer | _Scalar_f _ToFloatMax2D: TypeAlias = onp.ToFloat | onp.ToFloat1D | onp.ToFloat2D _ToJustFloat: TypeAlias = float | _Scalar_f _ToJustFloatND: TypeAlias = ( - onp.CanArrayND[_Scalar_f] + CanArrayND[_Scalar_f] | onp.SequenceND[_ToJustFloat] - | onp.SequenceND[onp.CanArrayND[_Scalar_f]] + | onp.SequenceND[CanArrayND[_Scalar_f]] ) # fmt: skip _ScalarOrArray_f8: TypeAlias = np.float64 | onp.Array[onp.AtLeast1D, np.float64] diff --git a/scipy-stubs/stats/_new_distributions.pyi b/scipy-stubs/stats/_new_distributions.pyi index b80de6a9..e523872d 100644 --- a/scipy-stubs/stats/_new_distributions.pyi +++ b/scipy-stubs/stats/_new_distributions.pyi @@ -13,6 +13,7 @@ from ._distribution_infrastructure import ( _RealInterval, _RealParameter, ) +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = ["Binomial", "Normal", "Uniform"] @@ -70,8 +71,8 @@ class Normal(ContinuousDistribution[_FloatT_co, _ShapeT_co], Generic[_ShapeT_co, self: Normal[_ShapeT, _FloatT], /, *, - mu: onp.CanArrayND[_FloatT, _ShapeT], - sigma: onp.CanArrayND[_FloatT | npc.integer | np.bool_, _ShapeT] | onp.ToInt, + mu: CanArrayND[_FloatT, _ShapeT], + sigma: CanArrayND[_FloatT | npc.integer | np.bool_, _ShapeT] | onp.ToInt, **kw: Unpack[_DistOpts], ) -> None: ... @overload # sigma: N-d @@ -79,8 +80,8 @@ class Normal(ContinuousDistribution[_FloatT_co, _ShapeT_co], Generic[_ShapeT_co, self: Normal[_ShapeT, _FloatT], /, *, - mu: onp.CanArrayND[_FloatT | npc.integer | np.bool_, _ShapeT] | onp.ToInt, - sigma: onp.CanArrayND[_FloatT, _ShapeT], + mu: CanArrayND[_FloatT | npc.integer | np.bool_, _ShapeT] | onp.ToInt, + sigma: CanArrayND[_FloatT, _ShapeT], **kw: Unpack[_DistOpts], ) -> None: ... @overload # mu, sigma: 0-d float diff --git a/scipy-stubs/stats/_stats_py.pyi b/scipy-stubs/stats/_stats_py.pyi index ea9e354f..c519d469 100644 --- a/scipy-stubs/stats/_stats_py.pyi +++ b/scipy-stubs/stats/_stats_py.pyi @@ -13,6 +13,7 @@ import optype.numpy.compat as npc from ._resampling import BootstrapMethod, ResamplingMethod from ._stats_mstats_common import siegelslopes, theilslopes from ._typing import Alternative, BaseBunch, BunchMixin, NanPolicy, PowerDivergenceStatistic +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround __all__ = [ "alexandergovern", @@ -119,7 +120,7 @@ _CombinePValuesMethod: TypeAlias = L["fisher", "pearson", "tippett", "stouffer", _RankMethod: TypeAlias = L["average", "min", "max", "dense", "ordinal"] _LMomentOrder: TypeAlias = L[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] | npc.integer -_LMomentOrder1D: TypeAlias = Sequence[_LMomentOrder] | onp.CanArrayND[npc.integer] +_LMomentOrder1D: TypeAlias = Sequence[_LMomentOrder] | CanArrayND[npc.integer] _RealLimits: TypeAlias = tuple[float | _Real0D, float | _Real0D] _Weigher: TypeAlias = Callable[[int], float | _Real0D] diff --git a/scipy-stubs/stats/_tukeylambda_stats.pyi b/scipy-stubs/stats/_tukeylambda_stats.pyi index 22bbfa40..d352ffc6 100644 --- a/scipy-stubs/stats/_tukeylambda_stats.pyi +++ b/scipy-stubs/stats/_tukeylambda_stats.pyi @@ -4,12 +4,14 @@ import numpy as np import optype.numpy as onp import optype.numpy.compat as npc +from scipy._typing import CanArrayND # path-dependent Pyright bug workaround + _ShapeT = TypeVar("_ShapeT", bound=tuple[int, ...]) @overload def tukeylambda_variance(lam: onp.ToFloat) -> onp.Array0D[np.float64]: ... @overload -def tukeylambda_variance(lam: onp.CanArrayND[npc.floating | npc.integer | np.bool_]) -> onp.Array[_ShapeT, np.float64]: ... +def tukeylambda_variance(lam: CanArrayND[npc.floating | npc.integer | np.bool_, _ShapeT]) -> onp.Array[_ShapeT, np.float64]: ... @overload def tukeylambda_variance(lam: onp.ToFloatND) -> onp.ArrayND[np.float64]: ... @@ -17,6 +19,6 @@ def tukeylambda_variance(lam: onp.ToFloatND) -> onp.ArrayND[np.float64]: ... @overload def tukeylambda_kurtosis(lam: onp.ToFloat) -> onp.Array0D[np.float64]: ... @overload -def tukeylambda_kurtosis(lam: onp.CanArrayND[npc.floating | npc.integer | np.bool_]) -> onp.Array[_ShapeT, np.float64]: ... +def tukeylambda_kurtosis(lam: CanArrayND[npc.floating | npc.integer | np.bool_, _ShapeT]) -> onp.Array[_ShapeT, np.float64]: ... @overload def tukeylambda_kurtosis(lam: onp.ToFloatND) -> onp.ArrayND[np.float64]: ...