diff --git a/scipy-stubs/ndimage/_nd_image.pyi b/scipy-stubs/ndimage/_nd_image.pyi new file mode 100644 index 00000000..f4f31f8b --- /dev/null +++ b/scipy-stubs/ndimage/_nd_image.pyi @@ -0,0 +1,206 @@ +# defined in scipy/ndimage/src/nd_image.c + +from _typeshed import Incomplete +from collections.abc import Callable, Mapping +from typing import overload +from typing_extensions import CapsuleType + +import numpy as np +import optype.numpy as onp +import optype.numpy.compat as npc + +from scipy._lib._ccallback import LowLevelCallable + +def correlate1d( + input: onp.ArrayND[npc.number], + weights: onp.ArrayND[np.float64], + axis: int, + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: int, + /, +) -> None: ... +def correlate( + input: onp.ArrayND[npc.number], + weights: onp.ArrayND[np.float64], + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: int | onp.ArrayND[np.intp], + /, +) -> None: ... +def uniform_filter1d( + input: onp.ArrayND[npc.number], + filter_size: int, + axis: int, + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: int, + /, +) -> None: ... +def min_or_max_filter1d( + input: onp.ArrayND[npc.number], + filter_size: int, + axis: int, + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: int, + minimum: int, + /, +) -> None: ... +def min_or_max_filter( + input: onp.ArrayND[npc.number], + footprint: onp.ArrayND[npc.number], + structure: onp.ArrayND[npc.number] | None, + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: int | onp.ArrayND[np.intp], + minimum: int, + /, +) -> None: ... +def rank_filter( + input: onp.ArrayND[npc.number], + rank: int, + footprint: onp.ArrayND[npc.number], + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: onp.ArrayND[np.intp], + /, +) -> None: ... +def generic_filter1d( + input: onp.ArrayND[npc.number], + fnc: Callable[..., Incomplete] | LowLevelCallable, + filter_size: int, + axis: int, + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: int, + extra_arguments: tuple[object, ...], + extra_keywords: Mapping[str, object], + /, +) -> None: ... +def generic_filter( + input: onp.ArrayND[npc.number], + fnc: Callable[..., Incomplete] | LowLevelCallable, + footprint: onp.ArrayND[npc.number], + output: onp.ArrayND[npc.number], + mode: int, + cval: float, + origin: int | onp.ArrayND[np.intp], + extra_arguments: tuple[object, ...], + extra_keywords: Mapping[str, object], + /, +) -> None: ... +def fourier_filter( + input: onp.ArrayND[npc.number], + parameters: onp.ArrayND[npc.number], + n: int, + axis: int, + output: onp.ArrayND[npc.number], + filter_type: int, + /, +) -> None: ... +def fourier_shift( + input: onp.ArrayND[npc.number], order: int, axis: int, output: onp.ArrayND[npc.number], mode: int, / +) -> None: ... +def spline_filter1d( + input: onp.ArrayND[npc.number], order: int, axis: int, output: onp.ArrayND[npc.number], mode: int, / +) -> None: ... +def geometric_transform( + input: onp.ArrayND[npc.number], + fnc: Callable[..., Incomplete] | LowLevelCallable, + coordinates: onp.ArrayND[npc.number] | None, + matrix: onp.ArrayND[npc.number] | None, + shift: onp.ArrayND[npc.number] | None, + output: onp.ArrayND[npc.number], + order: int, + mode: int, + cval: float, + nprepad: int, + extra_arguments: tuple[object, ...], + extra_keywords: Mapping[str, object], + /, +) -> None: ... +def zoom_shift( + input: onp.ArrayND[npc.number], + zoom: onp.ArrayND[npc.number] | None, + shift: onp.ArrayND[npc.number] | None, + output: onp.ArrayND[npc.number], + order: int, + mode: int, + cval: float, + nprepad: int, + grid_mode: int, + /, +) -> None: ... + +# +def find_objects(input: onp.ArrayND[npc.number], max_label: int) -> None: ... +def value_indices(arr: onp.ArrayND[npc.integer], ignoreValIsNone: bool, ignorevalArr: onp.ArrayND, /) -> None: ... + +# +def watershed_ift( + input: onp.ArrayND[npc.number], + markers: onp.ArrayND[npc.number], + strct: onp.ArrayND[npc.number], + output: onp.ArrayND[npc.number], +) -> None: ... +def distance_transform_bf( + input: onp.ArrayND[npc.number], + metric: int, + sampling: onp.ArrayND[npc.number] | None, + output: onp.ArrayND[npc.number] | None, + features: onp.ArrayND[npc.number] | None, +) -> None: ... +def distance_transform_op( + input: onp.ArrayND[npc.number], + strct: onp.ArrayND[npc.number], + distances: onp.ArrayND[npc.number], + features: onp.ArrayND[npc.number] | None, +) -> None: ... +def euclidean_feature_transform( + input: onp.ArrayND[npc.number], sampling: onp.ArrayND[npc.number] | None, features: onp.ArrayND[npc.number] +) -> None: ... + +# +@overload +def binary_erosion( + input: onp.ArrayND[npc.number], + strct: onp.ArrayND[npc.number], + mask: onp.ArrayND[npc.number] | None, + output: onp.ArrayND[npc.number], + border_value: int, + origin: onp.ArrayND[np.intp], + invert: int, + center_is_true: int, + return_coordinates: onp.ToFalse, +) -> int: ... +@overload +def binary_erosion( + input: onp.ArrayND[npc.number], + strct: onp.ArrayND[npc.number], + mask: onp.ArrayND[npc.number] | None, + output: onp.ArrayND[npc.number], + border_value: int, + origin: int | onp.ArrayND[np.intp], + invert: int, + center_is_true: int, + return_coordinates: onp.ToTrue, +) -> tuple[int, CapsuleType]: ... + +# +def binary_erosion2( + array: onp.ArrayND[npc.number], + strct: onp.ArrayND[npc.number], + mask: onp.ArrayND[npc.number] | None, + niter: int, + origin: int | onp.ArrayND[np.intp], + invert: int, + cobj: CapsuleType | None, +) -> None: ... diff --git a/scipy-stubs/ndimage/_ni_docstrings.pyi b/scipy-stubs/ndimage/_ni_docstrings.pyi new file mode 100644 index 00000000..2401628c --- /dev/null +++ b/scipy-stubs/ndimage/_ni_docstrings.pyi @@ -0,0 +1,31 @@ +from collections.abc import Callable +from typing import Final, Protocol, TypeVar, type_check_only + +__all__ = ["docfiller"] + +_FT = TypeVar("_FT", bound=Callable[..., object]) + +@type_check_only +class _Docfiller(Protocol): + def __call__(self, f: _FT, /) -> _FT: ... + +### + +_intput_doc: Final[str] = ... +_axis_doc: Final[str] = ... +_output_doc: Final[str] = ... +_nan_doc: Final[str] = ... +_size_foot_doc: Final[str] = ... +_mode_reflect_doc: Final[str] = ... +_mode_interp_constant_doc: Final[str] = ... +_mode_interp_mirror_doc: Final[str] = ... +_mode_multiple_doc: Final[str] = ... +_cval_doc: Final[str] = ... +_origin_doc: Final[str] = ... +_origin_multiple_doc: Final[str] = ... +_extra_arguments_doc: Final[str] = ... +_extra_keywords_doc: Final[str] = ... +_prefilter_doc: Final[str] = ... +docdict: Final[dict[str, str]] = ... + +docfiller: Final[_Docfiller] diff --git a/scipy-stubs/ndimage/_ni_label.pyi b/scipy-stubs/ndimage/_ni_label.pyi new file mode 100644 index 00000000..d0988c16 --- /dev/null +++ b/scipy-stubs/ndimage/_ni_label.pyi @@ -0,0 +1,25 @@ +# defined in scipy/ndimage/src/_ni_label.pyx + +from typing import TypeAlias + +import numpy as np +import optype.numpy as onp +import optype.numpy.compat as npc + +# matches `ctypedef fused data_t` +_data_t: TypeAlias = npc.integer | np.float32 | np.float64 # noqa: PYI042 + +### + +class NeedMoreBits(Exception): ... # undocumented + +def get_nonzero_line(a: onp.ArrayND[_data_t]) -> int: ... # undocumented +def get_read_line(a: onp.ArrayND[_data_t]) -> int: ... # undocumented +def get_write_line(a: onp.ArrayND[_data_t]) -> int: ... # undocumented + +# +def _label( + input: onp.ArrayND[_data_t | np.bool_], + structure: onp.ArrayND[np.bool_ | npc.integer], + output: onp.ArrayND[_data_t | np.bool_], +) -> int: ... # undocumented diff --git a/scipy-stubs/ndimage/_ni_support.pyi b/scipy-stubs/ndimage/_ni_support.pyi new file mode 100644 index 00000000..15056268 --- /dev/null +++ b/scipy-stubs/ndimage/_ni_support.pyi @@ -0,0 +1,55 @@ +from collections.abc import Iterable +from typing import Any, Literal, TypeAlias, TypeVar, overload + +import numpy as np +import optype as op +import optype.numpy as onp +import optype.numpy.compat as npc + +_T = TypeVar("_T") + +_Mode: TypeAlias = Literal["nearest", "wrap", "reflect", "grid-mirror", "mirror", "constant", "grid-wrap", "grid-constant"] +_ModeCode: TypeAlias = Literal[0, 1, 2, 3, 4, 5, 6] + +def _extend_mode_to_code(mode: _Mode, is_filter: bool = False) -> _ModeCode: ... + +# +@overload +def _normalize_sequence(input: str, rank: int) -> list[str]: ... +@overload +def _normalize_sequence(input: Iterable[_T], rank: int) -> list[_T]: ... +@overload +def _normalize_sequence(input: _T, rank: int) -> list[_T]: ... + +# +@overload +def _get_output( + output: type[complex | npc.number] | np.dtype[npc.number] | str | onp.ToComplexND | None, + input: onp.ArrayND[npc.number], + shape: tuple[int, ...] | None = None, + complex_output: Literal[False] = False, +) -> onp.ArrayND[npc.number]: ... +@overload +def _get_output( + output: type[complex | npc.complexfloating] | np.dtype[npc.complexfloating] | str | onp.ToJustComplexND | None, + input: onp.ArrayND[npc.complexfloating], + shape: tuple[int, ...] | None = None, + *, + complex_output: Literal[True], +) -> onp.ArrayND[npc.complexfloating]: ... +@overload +def _get_output( + output: type[complex | npc.complexfloating] | np.dtype[npc.complexfloating] | str | onp.ToJustComplexND | None, + input: onp.ArrayND[npc.complexfloating], + shape: tuple[int, ...] | None, + complex_output: Literal[True], +) -> onp.ArrayND[npc.complexfloating]: ... + +# +def _check_axes(axes: op.CanIndex | Iterable[op.CanIndex], ndim: int) -> tuple[int, ...]: ... + +# +@overload +def _skip_if_dtype(arg: str | np.dtype[Any] | type[np.generic]) -> None: ... +@overload +def _skip_if_dtype(arg: _T) -> _T | None: ... diff --git a/scipy-stubs/ndimage/_rank_filter_1d.pyi b/scipy-stubs/ndimage/_rank_filter_1d.pyi new file mode 100644 index 00000000..e0059bb1 --- /dev/null +++ b/scipy-stubs/ndimage/_rank_filter_1d.pyi @@ -0,0 +1,16 @@ +# defined in scipy/ndimage/src/_rank_filter_1d.cpp + +import numpy as np +import optype.numpy as onp +import optype.numpy.compat as npc + +def rank_filter( + in_arr_obj: onp.ArrayND[np.float32 | np.float64 | np.int64], + rank: int, + win_len: int, + out_arr_obj: onp.ArrayND[np.float32 | np.float64 | np.int64], + mode: int, + cval_obj: onp.ArrayND[npc.floating | npc.integer], + origin: int, + /, +) -> None: ... # undocumented