Skip to main content
`Ctrl`+`K`

# SciPy 1.16.0 Release Notes

SciPy 1.16.0 is the culmination of 6 months of hard work. It contains many new features, numerous bug-fixes, improved test coverage and better documentation. There have been a number of deprecations and API changes in this release, which are documented below. All users are encouraged to upgrade to this release, as there are a large number of bug-fixes and optimizations. Before upgrading, we recommend that users check that their own code does not use deprecated SciPy functionality (to do so, run your code with `python -Wd` and check for `DeprecationWarning` s). Our development attention will now shift to bug-fix releases on the 1.16.x branch, and on adding new features on the main branch.

This release requires Python 3.11-3.13 and NumPy 1.25.2 or greater.

## Highlights of this release

- Improved experimental support for the Python array API standard, including new support in `scipy.signal`, and additional support in `scipy.stats` and `scipy.special`. Improved support for JAX and Dask backends has been added, with notable support in `scipy.cluster.hierarchy`, many functions in `scipy.special`, and many of the trimmed statistics functions.

- `scipy.optimize` now uses the new Python implementation from the PRIMA package for COBYLA. The PRIMA implementation fixes many bugs in the old Fortran 77 implementation with a better performance on average.

- `scipy.sparse.coo_array` now supports n-D arrays with reshaping, arithmetic and reduction operations like sum/mean/min/max. No n-D indexing or `random_array` support yet.

- Updated guide and tools for migration from sparse matrices to sparse arrays.

- Nearly all functions in the `scipy.linalg` namespace that accept array arguments now support N-dimensional arrays to be processed as a batch.

- Two new `scipy.signal` functions, `firwin_2d` and `closest_STFT_dual_window`, for creation of a 2-D FIR filter and `ShortTimeFFT` dual window calculation, respectively.

- A new class, `scipy.spatial.transform.RigidTransform`, provides functionality to convert between different representations of rigid transforms in 3-D space.

- A new function `scipy.ndimage.vectorized_filter` for generic filters that take advantage of a vectorized Python callable was added.

## New features

### `scipy.io` improvements

- `scipy.io.savemat` now provides informative warnings for invalid field names.

- `scipy.io.mmread` now provides a clearer error message when provided with a source file path that does not exist.

- `scipy.io.wavfile.read` can now read non-seekable files.

### `scipy.integrate` improvements

- The error estimate of `scipy.integrate.tanhsinh` was improved.

### `scipy.interpolate` improvements

- Batch support was added to `scipy.interpolate.make_smoothing_spline`.

### `scipy.linalg` improvements

- Nearly all functions in the `scipy.linalg` namespace that accept array arguments now support N-dimensional arrays to be processed as a batch. See Batched Linear Operations for details.

- `scipy.linalg.sqrtm` is rewritten in C and its performance is improved. It also tries harder to return real-valued results for real-valued inputs if possible. See the function docstring for more details. In this version the input argument `disp` and the optional output argument `errest` are deprecated and will be removed four versions later. Similarly, after changing the underlying algorithm to recursion, the `blocksize` keyword argument has no effect and will be removed two versions later.

- Wrappers for `?stevd`, `?langb`, `?sytri`, `?hetri` and `?gbcon` were added to `scipy.linalg.lapack`.

- The default driver of `scipy.linalg.eigh_tridiagonal` was improved.

- `scipy.linalg.solve` can now estimate the reciprocal condition number and the matrix norm calculation is more efficient.

### `scipy.ndimage` improvements

- A new function `scipy.ndimage.vectorized_filter` for generic filters that take advantage of a vectorized Python callable was added.

- `scipy.ndimage.rotate` has improved performance, especially on ARM platforms.

### `scipy.optimize` improvements

- COBYLA was updated to use the new Python implementation from the PRIMA package. The PRIMA implementation fixes many bugs in the old Fortran 77 implementation. In addition, it results in fewer function evaluations on average, but it depends on the problem and for some problems it can result in more function evaluations or a less optimal result. For those cases the user can try modifying the initial and final trust region radii given by `rhobeg` and `tol` respectively. A larger `rhobeg` can help the algorithm take bigger steps initially, while a smaller `tol` can help it continue and find a better solution. For more information, see the PRIMA documentation.

- Several of the `scipy.optimize.minimize` methods, and the `scipy.optimize.least_squares` function, have been given a `workers` keyword. This allows parallelization of some calculations via a map-like callable, such as `multiprocessing.Pool`. These parallelization opportunities typically occur during numerical differentiation. This can greatly speed up minimization when the objective function is expensive to calculate.

- The `lm` method of `scipy.optimize.least_squares` can now accept `3-point` and `cs` for the `jac` keyword.

- The SLSQP Fortran 77 code was ported to C. When this method is used now the constraint multipliers are exposed to the user through the `multiplier` keyword of the returned `OptimizeResult` object.

- NNLS code has been corrected and rewritten in C to address the performance regression introduced in 1.15.x

- `scipy.optimize.root` now warns for invalid inner parameters when using the `newton_krylov` method

- The return value of minimization with `method='L-BFGS-B'` now has a faster `hess_inv.todense()` implementation. Time complexity has improved from cubic to quadratic.

- `scipy.optimize.least_squares` has a new `callback` argument that is applicable to the `trf` and `dogbox` methods. `callback` may be used to track optimization results at each step or to provide custom conditions for stopping.

### `scipy.signal` improvements

- A new function `scipy.signal.firwin_2d` for the creation of a 2-D FIR Filter using the 1-D window method was added.

- `scipy.signal.cspline1d_eval` and `scipy.signal.qspline1d_eval` now provide an informative error on empty input rather than hitting the recursion limit.

- A new function `scipy.signal.closest_STFT_dual_window` to calculate the `ShortTimeFFT` dual window of a given window closest to a desired dual window.

- A new classmethod `scipy.signal.ShortTimeFFT.from_win_equals_dual` to create a `ShortTimeFFT` instance where the window and its dual are equal up to a scaling factor. It allows to create short-time Fourier transforms which are unitary mappings.

- The performance of `scipy.signal.convolve2d` was improved.

### `scipy.sparse` improvements

- `scipy.sparse.coo_array` now supports n-D arrays using binary and reduction operations.

- Faster operations between two DIA arrays/matrices for: add, sub, multiply, matmul.

- `scipy.sparse.csgraph.dijkstra` shortest_path is more efficient.

- `scipy.sparse.csgraph.yen` has performance improvements.

- Support for lazy loading of `sparse.csgraph` and `sparse.linalg` was added.

### `scipy.spatial` improvements

- A new class, `scipy.spatial.transform.RigidTransform`, provides functionality to convert between different representations of rigid transforms in 3-D space, its application to vectors and transform composition. It follows the same design approach as `scipy.spatial.transform.Rotation`.

- `Rotation` now has an appropriate `__repr__` method, and improved performance for its `apply` method.

### `scipy.stats` improvements

- A new function `scipy.stats.quantile`, an array API compatible function for quantile estimation, was added.

- `scipy.stats.make_distribution` was extended to work with existing discrete distributions and to facilitate the creation of custom distributions in the new random variable infrastructure.

- A new distribution, `scipy.stats.Binomial`, was added.

- An `equal_var` keyword was added to `scipy.stats.tukey_hsd` (enables the Games-Howell test) and `scipy.stats.f_oneway` (enables Welch ANOVA).

- The moment calculation for `scipy.stats.gennorm` was improved.

- The `scipy.stats.mode` implementation was vectorized, for faster batch calculation.

- Support for `axis`, `nan_policy`, and `keepdims` keywords was added to `power_divergence`, `chisquare`, `pointbiserialr`, `kendalltau`, `weightedtau`, `theilslopes`, `siegelslopes`, `boxcox_llf`, and `linregress`.

- Support for `keepdims` and `nan_policy` keywords was added to `gstd`.

- The performance of `scipy.stats.special_ortho_group` and `scipy.stats.pearsonr` was improved.

- Support for an `rng` keyword argument was added to the `logcdf` and `cdf` methods of `multivariate_normal_gen` and `multivariate_normal_frozen`.

## Array API Standard Support

Experimental support for array libraries other than NumPy has been added to multiple submodules in recent versions of SciPy. Please consider testing these features by setting the environment variable `SCIPY_ARRAY_API=1` and providing PyTorch, JAX, CuPy or Dask arrays as array arguments.

Many functions in `scipy.stats`, `scipy.special`, `scipy.optimize`, and `scipy.constants` now provide tables documenting compatible array and device types as well as support for lazy arrays and JIT compilation. New features with support and old features with support added for SciPy 1.16.0 include:

- Most of the `scipy.signal` functionality

- `scipy.ndimage.vectorized_filter`

- `scipy.special.stdtrit`

- `scipy.special.softmax`

- `scipy.special.log_softmax`

- `scipy.stats.quantile`

- `scipy.stats.gstd`

- `scipy.stats.rankdata`

Features with extended array API support (generally, improved support for JAX and Dask) in SciPy 1.16.0 include:

- many of the `scipy.cluster.hierarchy` functions

- many functions in `scipy.special`

- many of the trimmed statistics functions in `scipy.stats`

SciPy now has a CI job that exercises GPU (CUDA) support, and as a result using PyTorch, CuPy or JAX arrays on GPU with SciPy is now more reliable.

## Deprecated features

- The unused `atol` argument of `scipy.optimize.nnls` is deprecated and will be removed in SciPy 1.18.0.

- The `disp` argument of `scipy.linalg.signm`, `scipy.linalg.logm`, and `scipy.linalg.sqrtm` will be removed in SciPy 1.18.0.

- `scipy.stats.multinomial` now emits a `FutureWarning` if the rows of `p` do not sum to `1.0`. This condition will produce NaNs beginning in SciPy 1.18.0.

- The `disp` and `iprint` arguments of the `l-bfgs-b` solver of `scipy.optimize` have been deprecated, and will be removed in SciPy 1.18.0.

## Expired Deprecations

- `scipy.sparse.conjtransp` has been removed. Use `.T.conj()` instead.

- The `quadrature='trapz'` option has been removed from `scipy.integrate.quad_vec`, and `scipy.stats.trapz` has been removed. Use `trapezoid` in both instances instead.

- `scipy.special.comb` and `scipy.special.perm` now raise when `exact=True` and arguments are non-integral.

- Support for inference of the two sets of measurements from the single argument `x` has been removed from `scipy.stats.linregress`. The data must be specified separately as `x` and `y`.

- Support for NumPy masked arrays has been removed from `scipy.stats.power_divergence` and `scipy.stats.chisquare`.

- A significant number of functions from non-public namespaces (e.g., `scipy.sparse.base`, `scipy.interpolate.dfitpack`) were cleaned up. They were previously already emitting deprecation warnings.

## Backwards incompatible changes

- Several of the `scipy.linalg` functions for solving a linear system (e.g. `solve`) documented that the RHS argument must be either 1-D or 2-D but did not always raise an error when the RHS argument had more the two dimensions. Now, many-dimensional right hand sides are treated according to the rules specified in Batched Linear Operations.

- `scipy.stats.bootstrap` now explicitly broadcasts elements of `data` to the same shape (ignoring `axis`) before performing the calculation.

- Several submodule names are no longer available via `from scipy.signal import *`, but may still be imported directly, as detailed at scipy/scipy-stubs#549.

## Build and packaging related changes

- The minimum supported version of Clang was bumped from 12.0 to 15.0.

- The lowest supported macOS version for wheels on PyPI is now 10.14 instead of 10.13.

- The sdist contents were optimized, resulting in a size reduction of about 50%, from 60 MB to 30 MB.

- For `Cython>=3.1.0`, SciPy now uses the new `cython --generate-shared` functionality, which reduces the total size of SciPy’s wheels and on-disk installations significantly.

- SciPy no longer contains an internal shared library that requires RPATH support, after `sf_error_state` was removed from `scipy.special`.

- A new build option `-Duse-system-libraries` has been added. It allows opting in to using system libraries instead of using vendored sources. Currently `Boost.Math` and `Qhull` are supported as system build dependencies.

## Other changes

- A new accompanying release of `scipy-stubs` (`v1.16.0.0`) is available.

- The internal dependency of `scipy._lib` on `scipy.sparse` was removed, which reduces the import time of a number of other SciPy submodules.

- Support for free-threaded CPython was improved: the last known thread-safety issues in `scipy.special` were fixed, and `pytest-run-parallel` is now used in a CI job to guard against regressions.

- Support for spin as a developer CLI was added, including support for editable installs. The SciPy-specific `python dev.py` CLI will be removed in the next release cycle in favor of `spin`.

- The vendored Qhull library was upgraded from version 2019.1 to 2020.2.

- A large amount of the C++ code in `scipy.special` was moved to the new header-only xsf library. That library was included back in the SciPy source tree as a git submodule.

- The `namedtuple`-like bunch objects returned by some SciPy functions now have improved compatibility with the `polars` library.

- The output of the `rvs` method of `scipy.stats.wrapcauchy` is now mapped to the unit circle between 0 and `2 * pi`.

- The `lm` method of `scipy.optimize.least_squares` now has a different behavior for the maximum number of function evaluations, `max_nfev`. The default for the `lm` method is changed to `100 * n`, for both a callable and a numerically estimated jacobian. This limit on function evaluations excludes those used for any numerical estimation of the Jacobian. Previously the default when using an estimated jacobian was `100 * n * (n + 1)`, because the method included evaluations used in the estimation. In addition, for the `lm` method the number of function calls used in Jacobian approximation is no longer included in `OptimizeResult.nfev`. This brings the behavior of `lm`, `trf`, and `dogbox` into line.

## Authors

- Name (commits)

- h-vetinari (4)

- aiudirog (1) +

- Anton Akhmerov (2)

- Thorsten Alteholz (1) +

- Gabriel Augusto (1) +

- Backfisch263 (1) +

- Nickolai Belakovski (5)

- Peter Bell (1)

- Benoît W. (1) +

- Evandro Bernardes (1)

- Gauthier Berthomieu (1) +

- Maxwell Bileschi (1) +

- Sam Birch (1) +

- Florian Bourgey (3) +

- Charles Bousseau (2) +

- Richard Strong Bowen (2) +

- Jake Bowhay (127)

- Matthew Brett (1)

- Dietrich Brunn (53)

- Evgeni Burovski (254)

- Christine P. Chai (12) +

- Gayatri Chakkithara (1) +

- Saransh Chopra (2) +

- Omer Cohen (1) +

- Lucas Colley (91)

- Yahya Darman (3) +

- Benjamin Eisele (1) +

- Donnie Erb (1)

- Sagi Ezri (58) +

- Alexander Fabisch (2) +

- Matthew H Flamm (1)

- Karthik Viswanath Ganti (1) +

- Neil Girdhar (1)

- Ralf Gommers (162)

- Rohit Goswami (4)

- Saarthak Gupta (4) +

- Matt Haberland (326)

- Sasha Hafner (1) +

- Joren Hammudoglu (11)

- Chengyu Han (1) +

- Charles Harris (1)

- Kim Hsieh (4) +

- Yongcai Huang (2) +

- Lukas Huber (1) +

- Yuji Ikeda (2) +

- Guido Imperiale (105) +

- Robert Kern (2)

- Harin Khakhi (2) +

- Agriya Khetarpal (4)

- Daniil Kiktenko (1) +

- Kirill R. (2) +

- Tetsuo Koyama (1)

- Jigyasu Krishnan (1) +

- Abhishek Kumar (2) +

- Pratham Kumar (3) +

- David Kun (1) +

- Eric Larson (3)

- lciti (1)

- Antony Lee (1)

- Kieran Leschinski (1) +

- Thomas Li (2) +

- Yuxi Long (2) +

- Christian Lorentzen (2)

- Loïc Estève (4)

- Panos Mavrogiorgos (1) +

- Nikolay Mayorov (2)

- Melissa Weber Mendonça (10)

- Michał Górny (1)

- Miguel Cárdenas (2) +

- Swastik Mishra (1) +

- Sturla Molden (2)

- Andreas Nazlidis (1) +

- Andrew Nelson (209)

- Parth Nobel (1) +

- Nick ODell (9)

- Giacomo Petrillo (1)

- Victor PM (10) +

- pmav99 (1) +

- Ilhan Polat (74)

- Tyler Reddy (128)

- Érico Nogueira Rolim (1) +

- Pamphile Roy (10)

- Mikhail Ryazanov (6)

- Atsushi Sakai (9)

- Marco Salathe (1) +

- sanvi (1) +

- Neil Schemenauer (2) +

- Daniel Schmitz (20)

- Martin Schuck (1) +

- Dan Schult (33)

- Tomer Sery (19)

- Adrian Seyboldt (1) +

- Scott Shambaugh (4)

- ShannonS00 (1) +

- sildater (3) +

- Param Singh (1) +

- G Sreeja (7) +

- Albert Steppi (133)

- Kai Striega (3)

- Anushka Suyal (2)

- Julia Tatz (1) +

- Tearyt (1) +

- Elia Tomasi (1) +

- Jamie Townsend (2) +

- Edgar Andrés Margffoy Tuay (4)

- Matthias Urlichs (1) +

- Mark van Rossum (1) +

- Jacob Vanderplas (2)

- David Varela (2) +

- Christian Veenhuis (3)

- vfdev (1)

- Stefan van der Walt (2)

- Warren Weckesser (5)

- Jason N. White (1) +

- windows-server-2003 (5)

- Zhiqing Xiao (1)

- Pavadol Yamsiri (1)

- Rory Yorke (3)

- Irwin Zaid (4)

- Austin Zhang (1) +

- William Zijie Zhang (1) +

- Zaikun Zhang (1) +

- Zhenyu Zhu (1) +

- Eric Zitong Zhou (11) +

- Case Zumbrum (2) +

- ਗਗਨਦੀਪ ਸਿੰਘ (Gagandeep Singh) (45)

  > A total of 126 people contributed to this release. People with a “+” by their names contributed a patch for the first time. This list of names is automatically generated, and may not be fully complete.

## Issues closed for 1.16.0

- #4800: ENH: ndimage.median_filter: behavior with NaNs

- #4878: ENH: ndimage.median_filter: excessive memory usage

- #5137: ENH: ndimage.generic_filter: function to return higher-dimensional…

- #5435: savemat silently drops entries starting with “_”

- #5451: ENH: linalg.solve: support broadcasting

- #6052: savemat does not save keys starting with underscore

- #6606: BUG: signal.bilinear: can’t handle leading zeros

- #6689: ENH: optimize: consider using NLopt’s version of `slsqp`

- #6755: ENH: ndimage.percentile_filter: take multiple percentiles

- #7518: DOC: optimize: meaning of accuracy in `fmin_slsqp` undocumented

- #7818: ENH: ndimage.uniform_filter: expands NaNs all the way to the…

- #8140: sparse LU decomposition does not solve with complex right-hand…

- #8367: ENH: stats.mvndst: make thread-safe

- #8411: nan with betainc for a=0, b=3 and x=0.5

- #8916: ENH: ndimage.generic_filter: slow on large images

- #9077: maximum_filter is not symmetrical with nans

- #9841: ENH: linalg: 0-th dimension must be fixed to 1 but got 2 (real…

- #9873: ENH: ndimage: majority voting filter

- #10416: ENH: optimize.minimize: slsqp: give better error when work array…

- #10793: BUG: integrate: `solve_ivp` and `odeint` with `lsoda` have…

- #11312: BUG: signal.cont2discrete not handling lti instances as documented

- #11328: Scipy unable to read piped wav file

- #12133: How to define new distributions?

- #12544: signal.spectral._triage_segments doesn’t support window as tuple…

- #12994: ENH: linalg.sqrtm: efficiently process upper triangular matrices

- #13577: Split scipy.signal.spectral._spectral_helper into two to support…

- #13666: ENH: invgauss.pdf should return correct output when mu=infinity

- #13788: Documentation for scipy.signal.resample should say what to use…

- #13789: Documentation for scipy.signal.decimate doesn’t say what to use…

- #13823: BUG: signal.bilinear: doesn’t work for complex valued arrays

- #13914: DOC: sparse.csgraph.shortest_path: predecessors array contains…

- #13952: fmin_cobyla result violates constraint

- #13982: ENH: linalg.eigh_tridiagonal: divide and conquer option

- #14394: ENH: optimize.slsqp: return Lagrange multipliers

- #14569: BUG: signal.resample: inconsistency across dtypes

- #14915: BUG: optimize.minimize: corruption/segfault with constraints

- #15153: BUG: signal.resample: incorrect with `datetime[ns]` for `t`…

- #15527: BUG: optimize: COBYLA hangs on some CPUs

- #16009: BUG: `act` fails for local GitHub Actions CI run

- #16142: ENH: Fix the random state in `scipy.stats.multivariate_normal.cdf()`

- #16203: BUG: scipy.io.savemat discards nested names with a leading digit

- #16234: BUG: Memory leak in _superluobject.c when `ENUM_CHECK` is not…

- #16452: doit based dev interface garbles pdb command history (in some…

- #17546: ENH: Adding ‘valid’ mode to ndimage.generic_filter

- #17787: BUG: Erratic results from RectBivariateSpline when smoothing…

- #17891: BUG: inconsistent checks for integrality in several distributions

- #17968: ENH: creation of a 2-D FIR Filter using 1-D window method

- #18046: BUG: dev.py does not work in a Windows CI environment on GHA…

- #18105: ENH: optimize `LbfgsInvHessProduct.todense()`, 10x speed…

- #18118: ENH: The Fortran 77 implementation of COBYLA is buggy and challenging…

- #18214: DOC: inconsistent definitions of “OP” and “OPinv” in eigsh

- #18346: DOC: optimize: l_bfgs_b: sets `maxiter` and `maxfun` to the…

- #18437: ENH: ndimage.generic_filter: support complex input

- #18740: BUG: scipy.optimize.bisect gives incorrect results for very small…

- #18866: MAINT: follow-up actions for array API support in `cluster`

- #18951: ENH: improve `python dev.py test` experience caused by imp…

- #18998: BUG: dev.py has issues with site-packages and Python installed…

- #19254: ENH: spatial.transform: cover proper rigid transformations with…

- #19362: BUG: optimize: warning generated by SLSQP is useless

- #19415: BUG: linalg.sqrtm results different between version 1.11.1 and…

- #19459: BUG: optimize.least_squares giving poor result compared to optimize.leastsq…

- #20219: BUG: failing `sqrtm` regression test

- #20366: ENH: Yens algorithm improvements and enhancements

- #20608: BUG: `refguide-check` incorrectly flags references to equations…

- #20622: DOC: signal: add an example cross-spectrogram application

- #20806: Failures for new `pytest-fail-slow` check in Windows CI jobs

- #20972: BUG: special.chdtrc: returns 1.0 when both degrees of freedom…

- #20999: BUG: ndimage.zoom: wrong output with zoom factor of 1

- #21020: DOC: signal: Use `where='post'` when plotting discrete response

- #21095: DOC: `RegularGridInterpolator` uses half down rounding instead…

- #21102: RFC/ENH?: `optimize.curve_fit`: option to use global optimization…

- #21293: DOC: stats.qmc.discrepancy: clarify deviation from reference

- #21317: BUG: `special.gammainc`: returns finite results with NaN…

- #21323: DOC: build fails with Sphinx 8

- #21341: DOC: signal.correlate: formula doesn’t match behavior when `x`…

- #21484: DEP: optimize.nnls: deprecate atol parameter which does nothing

- #21531: MAINT: `stats.dirichlet_multinomial`: relax `n` to `>=0`

- #21547: STY/DEV: fix and enable lint rule UP038

- #21606: ENH: stats: generic power law with negative index

- #21649: RFC: Splitting off special function scalar kernels into separate…

- #21692: BUG: optimize.shgo: not working with `jac=True`

- #21717: DOC: `assert_allclose` instead of `xp_assert_close` is recommended…

- #21740: CI: adding a GPU-enabled CI job

- #21764: ENH: linalg.lapack: add symmetric solvers

- #21844: ENH: linalg: wrap ?gbcon/?langb and use in linalg.solve

- #21879: BUG: `scipy.datasets` failing with Error 403 for readthedocs…

- #21971: ENH: `ndimage.median_filter`: extended `dtype` support?

- #21972: STY: fix and enable lint rule UP031

- #21986: ENH: optimize.root: warn when inner parameters are ignored with…

- #21995: BUG: `optimize.curve_fit` with `method='lm'` fails to determine…

- #21999: ENH: `io.mmread`: Provide better error message when loading…

- #22000: DOC: `ndimage.median_filter`: document behaviour with `nan`...

- #22011: BUG: interpolate.Akima1DInterpolator: different values on subsequent…

- #22044: TST: `optimize.elementwise.bracket_minimum`: CuPy failure

- #22045: DOC: stats: clarify the support of a distribution is unaffected…

- #22051: BUG: AttributeError: module ‘numpy’ has no attribute ‘AxisError’…

- #22054: BUG: ndimage, array types: `minimum_position` and `extrema`…

- #22055: DOC: ndimage.minimum and maximum: incorrect return type

- #22057: DOC: `stats.order_statistic`: docstring missing the “Returns”…

- #22065: DOC: sparse: Several functions are missing the ‘Returns’ section…

- #22072: DOC: PchipInterpolator: missing integrate function

- #22086: MAINT: signal: build warning (`sprintf`) on macOS

- #22093: DOC: integrate.quad: uses Gauss-Kronrod not Curtis-Clenshaw?

- #22136: DOC: linalg.matrix_balance: equation does not render

- #22144: Query: optimize.minimize: trust_constr does not avoid Nonlinear…

- #22163: DOC: update `scipy` module docstring for lazy loading

- #22164: MAINT: undo ignored errors in mypy

- #22195: Query: optimize.basinhopping: lowest minimum not accepted if…

- #22224: MAINT: remove end year from copyright

- #22252: MAINT: Fix a dtype check in `scipy.signal._waveforms.py`

- #22258: BUG: Constructing sparse matrix with big-endian float32/64 raises…

- #22263: BUG: linalg.solve doesn’t raise an error when A is a singular…

- #22265: BUG: linalg: `hecon` returns NaN incorrectly with some lower…

- #22271: Query: empty `Rotation` is not allowed in scipy=1.15

- #22282: QUERY/DEV: test failure in IDE with `SCIPY_ARRAY_API`

- #22288: QUERY: Pyright raises error/warning in IDE

- #22294: DOC: `source` now links to top of file, not location within…

- #22303: ENH: stats.special_ortho_group: improve and simplify

- #22309: DOC: optimize.elementwise.find_minimum: harmonize documented/implemented…

- #22328: QUERY: stats.beta.fit: `FitError` on reasonable data

- #22338: QUERY: Intellisense Autocomplete Not Working for `spatial.transform.Rotation`

- #22361: BUG: interpolation test TestSmoothingSpline.test_compare_with_GCVSPL…

- #22363: BUG: special test TestHyp2f1.test_region3[hyp2f1_test_case23]…

- #22367: QUERY/TYP: sparse: Pylance reports unreachable after `toarray()`

- #22378: DOC/TST: interpolate, signal: `smoke-docs` failures

- #22382: ENH: sparse.spmatrix: allow fast import

- #22395: BUG: special: failure of TestSystematic.test_besselj_complex…

- #22403: DOC: `gaussian_kde`‘s `bw_method='silverman'` deviates…

- #22415: Two `TestBatch` failures in macOS x86-64 Accelerate wheel build…

- #22429: DOC: integrate: missing bold font for a vector in tutorial

- #22437: DOC: The code of conduct link is dead

- #22449: BUG: sparse.csgraph.construct_dist_matrix: buffer dtype mismatch

- #22450: QUERY: difference between `namedtuple`s and objects produced…

- #22461: DOC: freqz_sos: claims that it was introduced in 0.19; no mention…

- #22470: BUG: `lfiltic`‘s handling of `a[0] != 1` differs from `lfilter`...

- #22485: DOC: remove links to the reference guide in the tutorials page

- #22488: DOC: interpolate.lagrange: the Lagrange function is using the…

- #22495: BUG: special test TestHyp2f1.test_region4[hyp2f1_test_case42]…

- #22501: BUG: `min_weight_full_bipartite_matching` fails for `coo_matrix`…

- #22508: DOC: Inconsistent notation in Linear algebra (scipy.linalg) page

- #22534: CI: failures `*/tests/test_extending` due to a regression in…

- #22559: BUG: `ndimage`: Numerical regressions in Dask 2025.2.0

- #22565: BUG: stats.multinomial.pmf: inconsistent results?

- #22581: DOC: stats.gaussian_kde: clarify the meaning of `factor`

- #22591: BUG: sparse.coo: `ImportError` for `upcast`

- #22601: BUG: special.logsumexp: inconsistency in phase when one element…

- #22626: BUG: scipy.stats: tmin/tmax: loss of precision for large integers

- #22646: CI/DOC: CloughTocher2DInterpolator: `UserWarning` in docs build

- #22659: BUG: spatial: `RigidTransform` does not support zero-length…

- #22692: DOC: interpolate.make_smoothing_spline: example plot uses the…

- #22700: CI: new failures: segfault in free-threaded, `linprog` invalid…

- #22703: DOC: integrate: `quad_vec` info return type is `_Bunch` not…

- #22767: BUG: test_cython Failing on Windows on ARM64 with clang-cl

- #22768: DOC/DEV: outdated references to Cirrus CI

- #22769: ENH: optimize: Return bound multiplier for SLSQP

- #22775: ENH: Use cython shared utility module

- #22791: BUG: optimize.nnls: unstable on i686 (32-bit) machine

- #22800: BUG: `signal.windows.kaiser_bessel_derived` uses `array`…

- #22881: DOC: Update minimum NumPy and Python in toolchain roadmap

- #22904: BUG: Wrong use of `__builtin_prefetch()`

- #22912: BUG: optimize: `SyntaxWarning: 'break' in a 'finally' block`…

- #22920: BUG: `check_test_name` fails with `UnicodeDecodeError`?

- #22921: DOC: clarify the status of Apple’s Accelerate Framework support

- #22931: BUG: interpolate._dierckx: `check_array()` can crash if the…

- #22942: TST: `special`: `test_compiles_in_cupy` is broken

- #22945: TST: Nested arrays failing in array-api-strict git tip

- #22951: BUG: stats.wrapcauchy: output isn’t wrapped around the unit circle

- #22956: BUG: special._ufuncs._ncx2_pdf: interpreter crash with extreme…

- #22965: BUG: The attribute “nit” is not found when using the callback…

- #22981: Bug with freqz when specifying worN after #22886

- #23035: TST: theilsope & siegelslope-related tests are failing on PyPy3.11…

- #23036: BUG: signal.csd: doesn’t zero-pad for different size inputs in…

- #23038: DOC: `linalg.toeplitz` does not support batching like the `1.16.0rc1`…

- #23046: ENH: `vectorized_filter`: special case of scalar `size`…

- #23061: DOC: Wrong SPDX identifier for OpenBLAS and LAPACK

- #23068: BUG: sparse: `!=` operator with csr matrices

- #23109: BUG: spatial.distance.cdist: wrong result in Yule metric

- #23169: BUG: special.betainc: evaluates incorrectly to nan when `b=0`

- #23184: BUG: min Python version enforcement in 1.16.x series? (and main)

- #23186: BUG: scipy.optimize minimize routine does not show info logs…

## Pull requests for 1.16.0

- #18375: ENH: signal: Add `firwin_2d` filter

- #20610: ENH: signal.ShortTimeFFT: determine arbitrary dual windows

- #20639: ENH: stats.rankdata: add array API standard support

- #20717: ENH: Speed up sparse.csgraph.dijkstra 2.0

- #20772: ENH: array types, signal: delegate to CuPy and JAX for correlations…

- #20950: ENH: spatial: speed up `Rotation.apply` by replacing `np.einsum`…

- #21180: ENH: sparse: efficient arithmetic operations for DIA format

- #21233: ENH: `stats.boxcox_llf`: vectorize for n-D arrays

- #21270: MAINT: make `boost_math` a `subproject`

- #21462: ENH: linalg.eig: support batched input

- #21482: MAINT/DEV: use Sphinx 8 for documentation builds

- #21557: ENH: `stats._continued_fraction`: elementwise, Array API…

- #21628: BUG:signal: Fix passing lti as system to cont2discrete

- #21674: DEV: use `spin`

- #21684: MAINT: `stats.dirichlet_multinomial` relax `n` to `>= 0`

- #21713: ENH: signal: add array API support / delegation to lfilter et…

- #21783: ENH: signal.windows: add array API support (take 2)

- #21863: CI: use macos-15 for a macOS run

- #21987: STY: fix lint rule UP031

- #22008: ENH: signal.vectorstrength: add array API standard support

- #22010: REL: set version to 1.16.0.dev0

- #22012: MAINT: bump min NumPy to 1.25.2, min Python to 3.11

- #22013: DEV: `gh_lists`: fix asterisk sanitisation

- #22015: DEV: lint: add option to lint all files

- #22019: MAINT: signal: remove tempita templating

- #22042: DOC, MAINT: Add a `"jupyterlite_sphinx_strip"` tag to the `scipy.stats`…

- #22046: TST: optimize: fix CuPy failure for `bracket_minimum`

- #22052: DOC: sparse.linalg: add note about complex matrices to `splu`…

- #22056: MAINT: stats.wilcoxon: fix attempt to access np.AxisError

- #22061: BUG: ndimage: convert array scalars on return

- #22062: MAINT: `_lib`: co-vendor array-api-extra and array-api-compat

- #22064: MAINT: `sparse.linalg._isolve`: Remove postprocess function

- #22068: ENH: optimize: migrate to use sparray

- #22070: ENH: `_lib`: JAX support (non-jitted)

- #22071: MAINT: Use `ENUM_CHECK_NAME` for avoiding memory leaks in `_superluobject.c`

- #22073: DEP: sparse: remove conjtransp

- #22074: DEP: remove remaining trapz references

- #22075: DEP: stats.linregress: remove one arg use

- #22076: BUG: datasets: add headers to fetchers to avoid 403 errors

- #22079: DEP: stats: remove support for masked arrays from `power_divergence`…

- #22087: DEP: special: raise error for non-integer types with exact=True…

- #22088: TST: optimize.elementwise.find_root: refactor tests to use `find_root`…

- #22089: TST: optimize: suppress incorrect sparray warning from scikit-sparse

- #22090: ENH: optimize: migrate to sparray (docs)

- #22092: MAINT: signal: fixed build warning (`sprintf`) on MacOS

- #22100: DEP: signal.spline: use standard submodule deprecation machinery

- #22101: DOC: update `stats`, `integrate`, `optimize`, and…

- #22108: CI: Run ‘Checkout scipy’ and ‘Check for skips’ only on Github…

- #22110: TST: linalg: use infinity norm of matrix when norm=’I’

- #22115: DOC: release notes: ensure TOC links to headings below

- #22116: DOC: update the interpolate roadmap

- #22122: MAINT: signal.oaconvolve: avoid xp <-> numpy conversions

- #22125: TST: stats: ensure tests are thread-safe

- #22127: ENH: linalg: add batch support for matrix -> scalar funcs

- #22130: TST: ndimage: array API-related cosmetic tweaks in tests

- #22131: TST: `skip|xfail_xp_backends` disregards `reason=`

- #22132: TST: array types: enforce namespace in tests

- #22133: ENH: linalg: add batch support for functions that accept a single…

- #22140: DOC: linalg.matrix_balance: move math to notes; ensure that it…

- #22142: ENH: signal: add CuPy/JAX delegation to scipy.signal

- #22148: TST: ndimage: fix test skip typo

- #22152: ENH: stats.f_oneway: add `equal_var` for Welch ANOVA

- #22154: ENH: linalg.clarkson_woodruff_transform: add batch support

- #22155: ENH: stats: add axis/nan_policy/keepdims/etc. support to correlation…

- #22157: ENH: linalg: add batch support for remaining cholesky functions

- #22160: DEP: interpolate: remove incidental imports from private modules

- #22161: DOC, MAINT: Add updates for interactive notebooks via `jupyterlite-sphinx`…

- #22165: ENH: linalg: add batch support to remaining eigenvalue functions

- #22166: ENH: linalg.block_diag: add batch support

- #22169: MAINT: sparse: refactor CSC to use CSR sparsetools

- #22170: ENH: signal: convert `symiirorder` and related filters to work…

- #22172: MAINT: improve overflow handling in factorial functions

- #22173: DOC: interpolate: add missing method `integrate` for `PchipInterpolator`

- #22174: MAINT: optimize: switch suppress_warnings to catch_warnings

- #22176: MAINT: special: Move Faddeeva into xsf

- #22179: DOC/DEV: mention `scipy-stubs` in building from source guide

- #22182: TST: ndimage: cupy tweaks for inplace out=

- #22185: ENH: stats.tukey_hsd: `equal_var=False` option to perform Games-Howell…

- #22186: DOC: interpolate: add a note about rounding rule of the `nearest`…

- #22190: MAINT: special: Migrate remaining exp and log functions to xsf

- #22192: ENH: linalg: add batch support to linear system solvers

- #22196: DOC: update scipy module docstring for lazy loading

- #22197: ENH: linalg.cossin: add batch support

- #22198: DOC: basinhopping, clarify when lowest_optimization_result is…

- #22201: DOC: Clarify support behavior in rv_continuous documentation

- #22208: ENH: io.wavfile: read unseekable files

- #22211: DOC: interpolate: add missed `integrate` doc link for `Akima1DInterpolator`

- #22212: ENH: linalg: wrap ?gbcon

- #22213: BUG: zpk2tf works correctly with complex k, real p, z

- #22214: TST: make torch default dtype configurable

- #22215: ENH: io: throw `FileNotFoundError` exception when the source…

- #22216: TST: TestBracketMinimum MPS shims

- #22217: ENH: linalg: wrap ?langb

- #22219: ENH: `_lib`: deobfuscate `jax.jit` crash in `_asarray`

- #22220: MAINT: stats: replace nonstandard calls in (mostly) array API…

- #22221: MAINT: linalg.leslie: use _apply_over_batch

- #22222: ENH: `special`/`stats`: implement xp-compatible `stdtrit`…

- #22226: ENH: signal.upfirdn: array API standard support

- #22227: TST: linalg: add missing lower arguments in test_sy_hetrs

- #22228: ENH: linalg.lapack: wrap ?sytri and ?hetri

- #22229: MAINT: cluster: remove unnecessary namespace changes

- #22231: ENH: add `callback` to `optimize.least_squares`

- #22234: MAINT: forward port 1.15.0 relnotes

- #22237: BENCH: sparse.csgraph.dijkstra: add benchmark

- #22240: ENH: array types: add dask.array support

- #22242: MAINT: integrate.cubature: fix undefined `asarray` use

- #22243: DOC: sparse: docstring example of random_array with uint32 data_sampler

- #22251: ENH: linalg.solve: use langb

- #22255: EHN: cluster: JAX support (non-jitted)

- #22256: ENH: special: JAX support (non-jitted)

- #22259: TST: signal: fix symiir tests

- #22260: TST: Make `@pytest.mark.usefixtures("skip_xp_backends")` redundant

- #22261: TST: dev.py quietly ignores user markers

- #22262: TST: Mark with `xp` all tests in Array API-compatible modules

- #22264: MAINT: interpolate: make BSpline allocate out arrays in C

- #22266: MAINT: linalg.solve: raise when diagonal matrix is exactly singular

- #22267: ENH: spatial.transform: baseline implementation of `RigidTransform`

- #22268: TST: clean up obsolete Array API fixtures

- #22269: DOC: optimize.curve_fit: add note about more advanced curve fitting

- #22273: ENH: linalg.solve: use gbcon

- #22274: ENH: `_contains_nan` for lazy arrays

- #22275: CI: add a GPU CI job

- #22278: BUG: Fix `Akima1DInterpolator` by returning linear interpolant…

- #22279: TST: Add skips for GPU CI failures

- #22280: TST: `_lib`: more idiomatic conditional skips

- #22281: TST: special: better skip message for stdtrit on JAX

- #22283: BUG: Fix banded Jacobian for lsoda: `ode` and `solve_ivp`

- #22284: BUG: sparse: better error message for unsupported dtypes

- #22289: CI: fix skip/trigger condition of GPU CI job

- #22293: ENH: Add __repr__ method to scipy.spatial.transform.Rotation

- #22295: DOC: signal.ShortTimeFFT.nearest_k_p: fix typo

- #22298: MAINT: stats: remove `mvn` fortran calls from `multivariate_normal.cdf`

- #22300: MAINT: remove end year from copyright

- #22302: MAINT: remove unused library import

- #22304: ENH: stats.special_ortho_group: speed up, allow 1x1 and 0x0 ortho…

- #22305: MAINT, DOC: forward port 1.15.1 relnotes

- #22308: TST: `_lib`: run tests with `@jax.jit`

- #22311: TST: replace `pytest.xfail` with `skip/xfail_xp_backends`

- #22312: ENH: stats.Binomial: add binomial distribution with new infrastructure

- #22313: BUG: signal.bilinear handles complex input, and strips leading…

- #22320: TST: array types: wrap namespaces centrally

- #22324: ENH: io: add invalid field name warning for `savemat`

- #22330: ENH: sparse.csgraph.yen: performance improvements

- #22340: MAINT: linalg: reorganize tridiagonal eigenvalue routines

- #22342: ENH: cluster: `linkage` support for jax.jit and dask

- #22343: ENH: `signal.{envelope,resample,resample_poly}`: array API…

- #22344: BUG: Fix bug with dpss degenerate case

- #22348: DOC: Harmonize summary line of docstrings of iterative sparse…

- #22350: ENH: Replace Fortran COBYLA with Python version from PRIMA

- #22351: DOC: sparse.linalg.eigsh: fix inconsistent definitions of OP…

- #22352: ENH: stats.quantile: add array API compatible quantile function

- #22358: MAINT: `special.nctdtrit`: migrate to boost

- #22359: MAINT: remove temporary `# type: ignore`‘s from #22162

- #22364: TST: bump tolerance on TestHyp2f1.test_region3[hyp2f1_test_case23]

- #22366: DOC: integrate: fix quad documentation to correctly describe…

- #22371: ENH: stats.make_distribution: allow definition of custom distributions

- #22375: DOC: sparse.linalg: fix doctest in scipy.sparse.linalg._norm.py

- #22376: DOC: sparse.linalg: sparray updates in doc_strings and Sakurai…

- #22379: DOC: interpolate.AAA: add may vary to example

- #22380: DOC: Replace link to X in header with link to scientific python…

- #22381: MAINT: special: A bit of clean up in stirling2.h

- #22386: DEP: optimize.nnls: deprecate unused atol parameter

- #22387: DOC: Add example to show usage of `predecessors` matrix returned…

- #22388: DOC: Fix documentation for `predecessors` matrix in `shortest_path`...

- #22389: DOC: Add “Assert function selection guideline” doc in the new…

- #22393: TST: stats: test support for array API compatible masked arrays

- #22396: DOC: signal: Use where=’post’ when plotting discrete response…

- #22397: DOC: spatial: Added mention of Davenport Angles to Rotation class…

- #22398: MAINT: special: clean up os/warnings modules exposed in special…

- #22399: TST: remove thread-unsafe skips for a now fixed Cython fused…

- #22401: TYP: Runtime-subscriptable `sparray` and `spmatrix` types

- #22406: ENH: linalg: Rewrite `sqrtm` in C with low-level nD support

- #22407: MAINT: remove `_lib`->``sparse`` dependency

- #22411: DOC: stats.gaussian_kde: clarify Silverman method

- #22413: DOC: stats: Edited the NIST Handbook reference

- #22416: TST: linalg: bump tolerances in two TestBatch tests

- #22419: MAINT: special: Remove `libsf_error_state` shared library in…

- #22420: TST: use singular `reason=` in `skip_xp_backends`

- #22421: BUG: ndimage: `binary_erosion` vs. broadcasted input

- #22422: MAINT: `_lib`: adapt `array_namespace` to accept scalars…

- #22425: MAINT: special: Update handling of `betainc` and `betaincc`…

- #22426: ENH: linalg: wrap ?stevd

- #22427: DEP: linalg: deprecate disp argument for signm, logm, sqrtm

- #22428: DOC: add note on getting the version switcher to behave to release…

- #22430: MAINT: cluster: vectorize tests in `is_valid_linkage`

- #22431: DOC: integrate: correct tutorial formatting

- #22433: BUG: interpolate.RectBivariateSpline: fix `NaN` output when…

- #22434: DOC: integrate.tanhsinh: remove incorrect reference to _differentiate

- #22435: MAINT: bump to array-api-extra git tip

- #22439: MAINT: special: Add `log1mexp` for `log(1 - exp(x))`

- #22440: DOC: Fix year of publication in `_dual_annealing.py`

- #22441: BUG: special: Fix incorrect handling of `nan` input in `gammainc`…

- #22442: DOC: Modified Link for code of conduct documentation

- #22443: DOC: Corrected Path

- #22445: CI: avoid mpmath pre-release version that’s failing in CI

- #22448: DOC: optimize.elementwise.find_minimum: fix documented termination…

- #22452: ENH: linalg.eigh_tridiagonal: add stevd as a driver and make…

- #22453: DOC: Improve docstrs of `dlsim`, `dimpulse`, `dstep`...

- #22454: BUG: signal.ShortTimeFFT: make attributes `win` and `dual_win`…

- #22455: ENH: stats.gstd: add array API support

- #22456: ENH: stats: add nan_policy support to power_divergence, chisquare

- #22457: TST: sparse: add tests for subscriptable types

- #22459: DOC: ndimage: fix wrong return type doc for `ndimage.minimum`…

- #22460: MAINT: signal.csd: port away from using `_spectral_helper`

- #22462: ENH: stats.pearsonr: two simple (but substantial) efficiency…

- #22463: DOC: update Halton docs

- #22464: DOC: Prevent A@x=b from becoming a URL

- #22467: MAINT/TST: address nits from Dask PR

- #22469: TST: stats: improve JAX test coverage

- #22475: BUG: optimize.shgo: delegate `options['jac']` to `minimizer_kwargs['jac']`

- #22478: ENH: optimize: add `workers` kwarg to BFGS, SLSQP, trust-constr

- #22480: CI: use mpmath pre-release again

- #22481: BUG: fix `make_lsq_spline` with a non-default axis

- #22483: MAINT: spatial: missing Cython type in build

- #22484: ENH: allow batching in `make_smoothing_spline`

- #22489: MAINT: simplifications related to NumPy bounds

- #22490: ENH: stats: add `marray` support to most remaining array API…

- #22491: DOC: stats: resampling tutorial fixups

- #22493: DOC: Add a docstring to OptimizeWarning

- #22494: ENH: _lib._make_tuple_bunch: pretend to be namedtuple even more

- #22496: MAINT: `stats.invgauss`: return correct result when `mu=inf`

- #22498: TST: bump tolerance in TestHyp2f1.test_region4[hyp2f1_test_case42]

- #22499: DOC: remove links to the reference guide in the tutorials page

- #22504: BLD: bump min version of Clang to 15.0, and macOS min version…

- #22505: ENH: stats.quantile: add discontinuous (HF 1-3) and Harrell-Davis…

- #22507: BENCH: make Benchmark.change_dimensionality a class variable

- #22509: DOC: sparse.linalg: add explanation for `MatrixRankWarning`

- #22511: BUG: sparse.csgraph: Added support for casting coo array to csc/csr…

- #22514: TST: special: Add edgecase tests for gammainc and friends

- #22516: STY: enable lint rule UP038 and fix instances in violation of…

- #22518: DOC: interpolate.FloaterHormannInterpolator: fix typos

- #22519: ENH: add workers to least_squares

- #22520: MAINT: Remove an extraneous dtype check in `scipy/signal/_waveforms.py`

- #22524: ENH:MAINT:optimize: Rewrite SLSQP and NNLS in C

- #22526: DOC: interpolate: reorganize the API listing

- #22527: DOC: sparse: add returns sections to some `_construct.py` functions

- #22528: DOC: interpolate: improve visibility of univariate interpolator…

- #22529: DOC: Update a link in SciPy Core Developer Guide

- #22530: DOC: interpolate: improve one-line descriptions

- #22531: DOC: batching in 1D/ND interpolation/smoothing routines

- #22535: DOC: update roadmap sparse

- #22536: DOC: io: link to netcdf4-python

- #22537: DOC: linalg: fix inconsistent notation

- #22541: Interpolate tutorial: discuss the bases and interconversions

- #22542: MAINT, DOC: forward port 1.15.2 release notes

- #22546: DOC: Add docstring for QhullError in _qhull.pyx [docs only]

- #22548: DOC: interpolate.lagrange: add notes / references; recommend…

- #22549: ENH: use `workers` keyword in `optimize._differentiable_functions.VectorFunct`…

- #22552: MAINT: sparse.csgraph: Raise error if `predecessors.dtype !=`…

- #22554: BUG: `lfiltic`‘s handling of `a[0] != 1` differs from `lfilter`...

- #22556: ENH: optimize: speed up `LbfgsInvHessProduct.todense` on large…

- #22557: ENH: Replace `_lazywhere` with `xpx.apply_where`

- #22560: ENH: Allow endpoints of custom distributions created with `stats.make_distribut`…

- #22562: DOC: Correct a typo: MATLAB(R) -> MATLAB®

- #22564: TST: add missing custom markers to pytest.ini

- #22566: TST: `skip_xp_backends(eager_only=True)`

- #22569: CI: fix dev-deps job by not testing Meson master

- #22572: TST: skip two ndimage tests that are failing for Dask

- #22573: DOC: sparse: Add docstrings to warnings in `scipy.sparse`

- #22575: ENH: `ndimage.vectorized_filter`: `generic_filter` with…

- #22579: DOC: signal.correlate: improve notes section

- #22584: TST: ndimage: tidy `skip_xp_backends`

- #22585: MAINT: stats.multinomial: `FutureWarning` about normalization…

- #22593: TST: add one more missing custom marker (`fail_slow`) to…

- #22597: ENH: stats.make_distribution: improve interface for overriding…

- #22598: MAINT: stats.bootstrap: broadcast like other stats functions

- #22602: DOC: stats.pearsonr: add tutorial

- #22603: MAINT: _lib: bump version array_api_compat to 1.11

- #22605: MAINT: signal: clean up unnecessary shims

- #22606: DOC: Ignore dict subclass docstring warning

- #22607: MAINT: special.logsumexp: improve behavior with complex infinities

- #22609: ENH: stats: shared array api support information to generate…

- #22610: ENH: _lib.doccer: Simplify and optimize indentation loop

- #22611: MAINT: stats: rewrite `gaussian_kde.integrate_box`, remove…

- #22614: MAINT: linalg: fix cython lint failures in build output

- #22616: ENH: stats: use `vecdot` and `nonzero` where appropriate

- #22618: BUG: Fix dual quaternion normalization procedure

- #22619: DOC: stats.gaussian_kde: clarify the meaning of `factor`

- #22621: MAINT: sparse: remove incidental imports from private modules

- #22623: ENH: signal.convolve2d: Performance Enhancement on WoA

- #22624: BUG: stats: `kde.integrate_box` was missing an `rng` parameter

- #22625: MAINT: Bump array-api-compat and array-api-strict

- #22628: MAINT: stats.tmin/tmax: ensure exact results with unreasonably…

- #22630: MAINT: stats: tmin/tmax tweaks

- #22631: DOC: interpolate.BarycentricInterpolator: documentation improvements

- #22632: MAINT: stats.multinomial: use dtype-dependent tolerance

- #22633: ENH: special: `softmax` / `log_softmax` Array API support

- #22634: TST: special: cosmetic nits

- #22636: MAINT: fix domain check for `ncfdtri`

- #22639: ENH: special: `support_alternative_backends` on Dask and jax.jit

- #22641: ENH: special: add Dask support to `rel_entr`

- #22645: DOC: stats.special_ortho_group: update algorithm description

- #22647: MAINT: sparse: rewrite `sparse._sputils.validateaxis` to centralize…

- #22648: MAINT: stats.quantile: fixup quantile for p < minimum plotting…

- #22649: DOC, CI: Fix legend warning for CloughTocher2DInterpolator docstring

- #22650: TST: stats: mark `nct` fit xslow

- #22651: MAINT: ndimage.zoom: eliminate noise when `zoom=1`

- #22653: DOC: add COBYQA to local optimizer comparison table

- #22658: CI: clean up free-threading job, add new job using pytest-run-parallel

- #22661: TST: fix some test failures and excessive memory use on Guix

- #22666: MAINT: interpolate: move NdBSpline evaluations to C

- #22667: DEV: cap Sphinx version in environment.yml

- #22668: DOC: document Array API support for the constants module and…

- #22669: TST: constants: tidy up tests

- #22671: MAINT: enforce modularity with `tach`

- #22675: ENH: stats: Improvements to support/domain endpoints in custom…

- #22676: ENH: stats.mode: vectorize implementation

- #22677: MAINT: use function handles rather than custom strings in `xp_capabilities_tabl`…

- #22683: MAINT: remove outdated `xp_` functions, `xp.asarray` on elementwise…

- #22686: TST/DOC: `lazy_xp_backends` in `xp_capabilities`

- #22687: MAINT: Bump Array API to 2024.12

- #22691: DOC: signal: fix `freqz_sos` and `sosfreqz` docstrings

- #22694: DOC: interpolate.make_smoothing_spline: improve example visibility

- #22695: MAINT: improve dtype handling now that `xp.result_type` accepts…

- #22696: MAINT: spatial: support empty case in `RigidTransform`

- #22698: MAINT/DOC: Update incomplete examples of `expectile()`

- #22701: TST: optimize: add more tests

- #22710: DOC: integrate.quad_vec: returned object is not a dictionary

- #22711: DOC: stats: Extend documentation of random_correlation matrix

- #22712: MAINT: bump array-api-extra to 0.7.0

- #22713: DOC: linalg.solve: clarify symmetry requirement

- #22714: MAINT: ndimage.maximum_filter: recommend `vectorized_filter`…

- #22715: ENH: ndimage.vectorized_filter: make CuPy-compatible

- #22716: DOC: optimize: Clarify use of `xtol` in 1D rootfinder docstrings

- #22718: TST: special: overhaul test_support_alternative_backends

- #22719: TST: add tests for `ncfdtri`

- #22722: DOC: ndimage.affine_transformation: add examples to docstring

- #22723: DOC: fft.dst: add example to docstring

- #22725: MAINT: ndimage.affine_transform: remove outdated and unhelpful…

- #22729: DOC: datasets.download_all: add examples to docstring

- #22735: ENH: stats: lazy trimmed stats for Dask and JAX

- #22738: DOC: PRIMA licence and reference fix

- #22740: TST: special: remove test skips due to array-api-strict#131

- #22741: CI: fix crash of free-threading job in `sparse`, bump GHA…

- #22742: CI/MAINT: make special.errstate thread-safe and run pytest-run-parallel…

- #22745: DOC: fft.rfft2: add example to docstring

- #22749: ENH: stats: add support for multiple parameterizations for custom…

- #22750: DOC: fft.hfft2: added example

- #22751: TST: linalg.test_batch: minor tolerance bumps

- #22755: MAINT: special: refine `logsumexp` writeback behaviour

- #22756: BUG/TST: `special.logsumexp` on non-default device

- #22759: TST: weightedtau rng thread safety

- #22760: BUG: optimize: `VectorFunction.f_updated` wasn’t being set…

- #22761: DOC: optimize: l-bfgs-b: clarify what is meant by `maxfun`...

- #22764: MAINT: optimize: `VectorFunction`: remove reference cycle

- #22766: DOC: improve docstrings of boxcox and yeojohnson

- #22770: TST: stats: add marray tests for _length_nonmasked directly

- #22771: TST: stats: don’t encapsulate `pytest.warns`

- #22778: MAINT: switch to vendoring libprima/prima

- #22779: MAINT: optimize: `VectorFunction`: fix array copy for sparse

- #22782: MAINT: fix failures in free-threading(parallel=1) job

- #22783: TST/MAINT: signal.symiirorder2: r, omega, precision are floats;…

- #22785: DOC/DEV: remove references to CirrusCI in skipping CI doc

- #22787: DOC: optimize: Add the multiplier details to SLSQP funcs

- #22788: TST: stats.quantile: add edge test case for axis=None && keepdims=True

- #22790: MAINT: optimize.least_squares: change `x_scale` default

- #22796: ENH/BLD: cython: share memoryview utility between extension modules

- #22798: TST: stats: mark some tests as slow

- #22802: BUG: optimize: Fix instability with NNLS on 32bit systems

- #22803: MAINT: use `xp.asarray` instead of `xp.array`

- #22805: CI: start using the `CIBW_ENABLE` env var

- #22807: TST: fix issue with `cython_special` test which was missing…

- #22808: BUG: `special.logsumexp` device propagation on PyTorch

- #22809: ENH: `optimize.root`: add warning for invalid inner parameters…

- #22811: ENH: ndimage.rotate: performance enhancement on WoA

- #22814: BUG: signal.resample: Fix bug for parameter num=2 (including…

- #22815: MAINT: sparse: add lazy loading for csgraph and linalg

- #22818: DEV: add `.editorconfig`

- #22820: MAINT: signal: consolidate `order_filter` tests

- #22821: ENH: signal.lp2{lp,hp,bp,bs}: add array API standard support

- #22823: MAINT: integrate.tanhsinh: simplify error estimate

- #22829: DOC: stats.qmc.discrepancy: clarify definitions

- #22832: DOC: interpolate: remove outdated deprecation notices

- #22833: DOC: special.comb: remove missed deprecation notice

- #22835: MAINT: stats.boxcox_llf: refactor for simplicity

- #22842: MAINT: bump boost_math to 1.88.0

- #22843: DOC: `special`: add `xp_capabilities` to logsumexp

- #22844: TST: `stats`: minor nits to test_stats.py

- #22845: TST: `stats`: reorder tests to match `xp_capabilities`

- #22846: MAINT: _lib/differentiate: update EIM with `at.set`

- #22848: MAINT: _lib: eliminate try/excepts in EIM

- #22850: TST: optimize `VectorFunction` add test for J0=None branch…

- #22852: TST: fix `boxcox_llf` test failure on main

- #22854: MAINT: special: Add `xsf` as a submodule of SciPy

- #22855: MAINT: spatial.pdist: make dimensionality error more descriptive

- #22858: DOC: Fix typo in `ndimage.generic_gradient_magnitude()`

- #22859: DOC: rewording of “ties” into “tied pairs” for clearer meaning

- #22862: TST: integrate/spatial: make fail_slow allowances

- #22863: TST: reintroduce `eager_warns` and fix free-threading test…

- #22864: MAINT: linalg.svd: raise correct error message for GESDD when…

- #22873: ENH: sparse: Support nD sum/mean/min/max/argmin for sparse arrays

- #22875: CI: limit pytest-fail-slow usage to a single CI job

- #22886: ENH: signal: filter design functions array API standard support

- #22891: DOC: Document allowed NumPy / Python versions

- #22893: MAINT: vendor qhull as subproject and add `-Duse-system-libraries`

- #22895: MAINT: signal: correct the `get_window` delegator

- #22896: ENH: signal: `tf2zpk` et al Array API

- #22897: ENH: sparse: ND binary operations support

- #22898: DEV: add editable install support for `spin`

- #22899: MAINT: bump array-api submodules

- #22900: MAINT: fix `np.copyto` warnings on Dask

- #22908: MAINT: bump qhull to 2020.2

- #22909: TST: Use `jax_autojit`

- #22913: BUG: fix syntax warning break in finally block under 3.14

- #22915: BLD: optimize sdist contents through a dist script

- #22916: DOC: integrate.solve_bvp: add missing reference details

- #22917: DEV: fix invocation of linter on Windows

- #22918: TST: `linalg` add test coverage to exception handling for invalid…

- #22926: MAINT: spatial.cKDTree: remove software prefetching and software…

- #22927: MAINT: tools/check_test_name: specify encoding

- #22930: DOC: linalg: update roadmap entry for BLAS/LAPACK bindings

- #22932: BUG: interpolate: do not call PyArray macros on non-arrays

- #22934: MAINT: optimize.zeros: fix error message

- #22939: TST: spatial.transform: Add array API standard support for testing

- #22941: MAINT: stats.qmc.Sobol: fix stacklevel of warning

- #22944: MAINT: fix regressions in array-api-strict after disabling np.float64

- #22946: ENH: `special`: add `xp_capabilities`

- #22947: MAINT: avoid nested `asarray` calls

- #22949: MAINT: mass rename `make_skip_xp_backends` to `make_xp_test_case`

- #22950: MAINT: refresh gpu-ci pixi.lock

- #22952: MAINT, DOC: forward port 1.15.3 release notes

- #22955: MAINT: wheel downloader

- #22959: ENH: `cluster`: more lazy functions

- #22960: DOC/TST: `cluster.hierarchy`: use `xp_capabilities`

- #22961: TST: `cluster`: reduce test reliance from linkage

- #22963: MAINT: wrap wrapcauchy samples around the circle

- #22967: CI: address some potential vulnerabilities

- #22968: DOC: outline that not all attributes of OptimizeResult may be…

- #22969: MAINT: stats.make_distribution: fix most remaining discrete distribution…

- #22970: MAINT: stats.DiscreteDistribution: fix inversion methods

- #22971: MAINT: fix skellam distribution tests

- #22973: BUG: interpolate.make_splrep: raise error when `residuals.sum()`…

- #22976: ENH: stats: Implement _munp for gennorm

- #22982: BUG: signal: fix incorrect vendoring of `npp_polyval`

- #22984: MAINT: special: remove test_compiles_in_cupy

- #22987: DOC: sparse: sparray migration guide updates

- #22991: DOC: update SciPy 1.16.0 release notes

- #22992: ENH: `signal.cspline1d_eval,qspline1d_eval` throw exception…

- #22994: DOC: signal.csd: Small fixes to docstr

- #22997: CI: temporarily disable free-threaded job with parallel-threads

- #22998: BUG: Fix duplicate `--pyargs` due to double addition in SciPy…

- #22999: MAINT: bump up array-api-compat and array-api-extra

- #23000: ENH/DOC/TST: `cluster.vq`: use `xp_capabilities`

- #23001: DOC: `special`: update top-level docs to reflect `xp_capabilities`

- #23005: BUG: sparse: fix mean/sum change in return of np.matrix for sparse…

- #23010: DOC: edit and extend the release notes for 1.16.0

- #23013: MAINT: version pins/prep for 1.16.0rc1

- #23014: DOC: .mailmap updates for 1.16.0rc1

- #23029: DOC: add documentation for the new `use-system-libraries` build…

- #23031: REL: set 1.16.0rc2 unreleased

- #23040: DOC: linalg: adjust release note wording

- #23044: TST: update all `result_to_tuple=` callables to accept two…

- #23047: BUG: signal.csd: Zero-pad for different size inputs

- #23048: MAINT: ndimage.vectorized_filter: fix behavior of axes when length…

- #23051: MAINT/ENH: ndimage.vectorized_filter: adjust scalar size to match…

- #23086: CI: update windows-2019 runner image to windows-2022

- #23091: BUG: sparse: correct eq and ne with different shapes. (and add…

- #23098: MAINT: 1.16.0rc2 backports

- #23099: MAINT: fix SPDX license expressions for LAPACK, OpenBLAS, GCC

- #23106: TST: CI broken vs pytest 8.4.0

- #23110: BUG: spatial.distance: yule implementation in `distance_metrics.h`

- #23113: DOC: improve docs for `-Duse-system-libraries` build option

- #23114: DOC: Add missing BLAS Level 2 functions

- #23127: DOC: fix linkcode_resolve line-number anchors

- #23131: REL: set 1.16.0rc3 unreleased

- #23134: BUG: linalg.lapack: fix incorrectly sized work array for {c,z}syrti

- #23144: MAINT: array types: array-api-strict got stricter

- #23146: DOC: stats.Mixture: add example

- #23164: MAINT: backports and prep for 1.16.0 “final”

- #23170: TST: add all SciPy-specific pytest markers to `scipy/conftest.py`

- #23178: CI: skip JAX 0.6.2

- #23180: CI: remove free-threading workarounds in wheel builds

- #23189: BLD: implement build-time version check for minimum Python version

- #23197: DEP: optimize: Add deprecation warnings to L-BFGS-B `disp`...