SciPy 1.12.0 Release Notes
Note: SciPy 1.12.0
is not released yet!
SciPy 1.12.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.12.x
branch, and on adding new features on the main branch.
This release requires Python 3.9+
and NumPy 1.22.4
or greater.
For running on PyPy, PyPy3 6.0+
is required.
Highlights of this release
- Experimental support for the array API standard has been added to part of
scipy.special
, and to all ofscipy.fft
andscipy.cluster
. There are
likely to be bugs and early feedback for usage with CuPy arrays, PyTorch
tensors, and other array API compatible libraries is appreciated. Use the
SCIPY_ARRAY_API
environment variable for testing. - A new class,
ShortTimeFFT
, provides a more versatile implementation of the
short-time Fourier transform (STFT), its inverse (ISTFT) as well as the (cross-)
spectrogram. It utilizes an improved algorithm for calculating the ISTFT. - Several new constructors have been added for sparse arrays, and many operations
now additionally support sparse arrays, further facilitating the migration
from sparse matrices. - A large portion of the
scipy.stats
API now has improved support for handling
NaN
values, masked arrays, and more fine-grained shape-handling. The
accuracy and performance of a number ofstats
methods have been improved,
and a number of new statistical tests and distributions have been added.
New features
scipy.cluster
improvements
- Experimental support added for the array API standard; PyTorch tensors,
CuPy arrays and array API compatible array libraries are now accepted
(GPU support is limited to functions with pure Python implementations).
CPU arrays which can be converted to and from NumPy are supported
module-wide and returned arrays will match the input type.
This behaviour is enabled by setting theSCIPY_ARRAY_API
environment
variable before importingscipy
. This experimental support is still
under development and likely to contain bugs - testing is very welcome.
scipy.fft
improvements
- Experimental support added for the array API standard; functions which are
part of thefft
array API standard extension module, as well as the
Fast Hankel Transforms and the basic FFTs which are not in the extension
module, now accept PyTorch tensors, CuPy arrays and array API compatible
array libraries. CPU arrays which can be converted to and from NumPy arrays
are supported module-wide and returned arrays will match the input type.
This behaviour is enabled by setting theSCIPY_ARRAY_API
environment
variable before importingscipy
. This experimental support is still under
development and likely to contain bugs - testing is very welcome.
scipy.integrate
improvements
- Added
scipy.integrate.cumulative_simpson
for cumulative quadrature
from sampled data using Simpson's 1/3 rule.
scipy.interpolate
improvements
- New class
NdBSpline
represents tensor-product splines in N dimensions.
This class only knows how to evaluate a tensor product given coefficients
and knot vectors. This way it generalizesBSpline
for 1D data to N-D, and
parallelsNdPPoly
(which represents N-D tensor product polynomials).
Evaluations exploit the localized nature of b-splines. NearestNDInterpolator.__call__
accepts**query_options
, which are
passed through to theKDTree.query
call to find nearest neighbors. This
allows, for instance, to limit the neighbor search distance and parallelize
the query using theworkers
keyword.BarycentricInterpolator
now allows computing the derivatives.- It is now possible to change interpolation values in an existing
CloughTocher2DInterpolator
instance, while also saving the barycentric
coordinates of interpolation points.
scipy.linalg
improvements
- Access to new low-level LAPACK functions is provided via
dtgsyl
and
stgsyl
.
scipy.ndimage
improvements
scipy.optimize
improvements
scipy.optimize.nnls
is rewritten in Python and now implements the so-called
fnnls or fast nnls.- The result object of
scipy.optimize.root
andscipy.optimize.root_scalar
now reports the method used. - The
callback
method ofscipy.optimize.differential_evolution
can now be
passed more detailed information via theintermediate_results
keyword
parameter. Also, the evolutionstrategy
now accepts a callable for
additional customization. The performance ofdifferential_evolution
has
also been improved. minimize
methodNewton-CG
has been made slightly more efficient.minimize
methodBFGS
now accepts an initial estimate for the inverse
of the Hessian, which allows for more efficient workflows in some
circumstances. The new parameter ishess_inv0
.minimize
methodsCG
,Newton-CG
, andBFGS
now accept parameters
c1
andc2
, allowing specification of the Armijo and curvature rule
parameters, respectively.curve_fit
performance has improved due to more efficient memoization
of the callable function.isotonic_regression
has been added to allow nonparametric isotonic
regression.
scipy.signal
improvements
freqz
,freqz_zpk
, andgroup_delay
are now more accurate
whenfs
has a default value.- The new class
ShortTimeFFT
provides a more versatile implementation of the
short-time Fourier transform (STFT), its inverse (ISTFT) as well as the (cross-)
spectrogram. It utilizes an improved algorithm for calculating the ISTFT based on
dual windows and provides more fine-grained control of the parametrization especially
in regard to scaling and phase-shift. Functionality was implemented to ease
working with signal and STFT chunks. A section has been added to the "SciPy User Guide"
providing algorithmic details. The functionsstft
,istft
andspectrogram
have been marked as legacy.
scipy.sparse
improvements
sparse.linalg
iterative solverssparse.linalg.cg
,
sparse.linalg.cgs
,sparse.linalg.bicg
,sparse.linalg.bicgstab
,
sparse.linalg.gmres
, andsparse.linalg.qmr
are rewritten in Python.- Updated vendored SuperLU version to
6.0.1
, along with a few additional
fixes. - Sparse arrays have gained additional constructors:
eye_array
,
random_array
,block_array
, andidentity
.kron
andkronsum
have been adjusted to additionally support operation on sparse arrays. - Sparse matrices now support a transpose with
axes=(1, 0)
, to mirror
the.T
method. LaplacianNd
now allows selection of the largest subset of eigenvalues,
and additionally now supports retrieval of the corresponding eigenvectors.
The performance ofLaplacianNd
has also been improved.- The performance of
dok_matrix
anddok_array
has been improved,
and their inheritance behavior should be more robust. hstack
,vstack
, andblock_diag
now work with sparse arrays, and
preserve the input sparse type.- A new function,
scipy.sparse.linalg.matrix_power
, has been added, allowing
for exponentiation of sparse arrays.
scipy.spatial
improvements
- Two new methods were implemented for
spatial.transform.Rotation
:
__pow__
to raise a rotation to integer or fractional power and
approx_equal
to check if two rotations are approximately equal. - The method
Rotation.align_vectors
was extended to solve a constrained
alignment problem where two vectors are required to be aligned precisely.
Also when given a single pair of vectors, the algorithm now returns the
rotation with minimal magnitude, which can be considered as a minor
backward incompatible change. - A new representation for
spatial.transform.Rotation
called Davenport
angles is available throughfrom_davenport
andas_davenport
methods. - Performance improvements have been added to
distance.hamming
and
distance.correlation
. - Improved performance of
SphericalVoronoi
sort_vertices_of_regions
and two dimensional area calculations.
scipy.special
improvements
- Added
scipy.special.stirling2
for computation of Stirling numbers of the
second kind. Both exact calculation and an asymptotic approximation
(the default) are supported viaexact=True
andexact=False
(the
default) respectively. - Added
scipy.special.betaincc
for computation of the complementary incomplete Beta function andscipy.special.betainccinv
for computation of its inverse. - Improved precision of
scipy.special.betainc
andscipy.special.betaincinv
- Experimental support added for alternative backends: functions
scipy.special.log_ndtr
,scipy.special.ndtr
,scipy.special.ndtri
,
scipy.special.erf
,scipy.special.erfc
,scipy.special.i0
,
scipy.special.i0e
,scipy.special.i1
,scipy.special.i1e
,
scipy.special.gammaln
,scipy.special.gammainc
,scipy.special.gammaincc
,
scipy.special.logit
, andscipy.special.expit
now accept PyTorch tensors
and CuPy arrays. These features are still under development and likely to
contain bugs, so they are disabled by default; enable them by setting a
SCIPY_ARRAY_API
environment variable to1
before importingscipy
.
Testing is appreciated!
scipy.stats
improvements
- Added
scipy.stats.quantile_test
, a nonparametric test of whether a
hypothesized value is the quantile associated with a specified probability.
Theconfidence_interval
method of the result object gives a confidence
interval of the quantile. scipy.stats.wasserstein_distance
now computes the Wasserstein distance
in the multidimensional case.scipy.stats.sampling.FastGeneratorInversion
provides a convenient
interface to fast random sampling via numerical inversion of distribution
CDFs.scipy.stats.geometric_discrepancy
adds geometric/topological discrepancy
metrics for random samples.scipy.stats.multivariate_normal
now has afit
method for fitting
distribution parameters to data via maximum likelihood estimation.scipy.stats.bws_test
performs the Baumgartner-Weiss-Schindler test of
whether two-samples were drawn from the same distribution.scipy.stats.jf_skew_t
implements the Jones and Faddy skew-t distribution.scipy.stats.anderson_ksamp
now supports a permutation version of the test
using themethod
parameter.- The
fit
methods ofscipy.stats.halfcauchy
,scipy.stats.halflogistic
, and
scipy.stats.halfnorm
are faster and more accurate. scipy.stats.beta
entropy
accuracy has been improved for extreme values of
distribution parameters.- The accuracy of
sf
and/orisf
methods have been improved for
several distributions:scipy.stats.burr
,scipy.stats.hypsecant
,
scipy.stats.kappa3
,scipy.stats.loglaplace
,scipy.stats.lognorm
,
scipy.stats.lomax
,scipy.stats.pearson3
,scipy.stats.rdist
, and
scipy.stats.pareto
. - The following functions now support parameters
axis
,nan_policy
, andkeep_dims
:scipy.stats.entropy
,scipy.stats.differential_entropy
,scipy.stats.variation
,scipy.stats.ansari
,scipy.stats.bartlett
,scipy.stats.levene
,scipy.stats.fligner
,scipy.stats.cirmean,
scipy.stats.circvar,
scipy.stats.circstd,
scipy.stats.tmean,
scipy.stats.tvar,
scipy.stats.tstd,
scipy.stats.tmin,
scipy.stats.tmax, and
scipy.stats.tsem`. - The
logpdf
andfit
methods ofscipy.stats.skewnorm
have been improved. - The beta negative binomial distribution is implemented as
scipy.stats.betanbinom
. - The speed of
scipy.stats.invwishart
rvs
andlogpdf
have been improved. - A source of intermediate overflow in
scipy.stats.boxcox_normmax
withmethod='mle'
has been eliminated, and the returned value oflmbda
is constrained such that the transformed data will not overflow. scipy.stats.nakagami
stats
is more accurate and reliable.- A source of intermediate overflow in
scipy.norminvgauss.pdf
has been eliminated. - Added support for masked arrays to
stats.circmean
,stats.circvar
,
stats.circstd
, andstats.entropy
. dirichlet
has gained a new covariance (cov
) method.- Improved accuracy of
multivariate_t
entropy with large degrees of
freedom. loggamma
has an improvedentropy
method.
Deprecated features
-
Error messages have been made clearer for objects that don't exist in the
public namespace and warnings sharpened for private attributes that are not
supposed to be imported at all. -
scipy.signal.cmplx_sort
has been deprecated and will be removed in
SciPy 1.14. A replacement you can use is provided in the deprecation message. -
Values the the argument
initial
ofscipy.integrate.cumulative_trapezoid
other than0
andNone
are now deprecated. -
scipy.stats.rvs_ratio_uniforms
is deprecated in favour of
scipy.stats.sampling.RatioUniforms
-
scipy.integrate.quadrature
andscipy.integrate.romberg
have been
deprecated due to accuracy issues and interface shortcomings. They will
be removed in SciPy 1.14. Please usescipy.integrate.quad
instead. -
Coinciding with upcoming changes to function signatures (e.g. removal of a
deprecated keyword), we are deprecating positional use of keyword arguments
for the affected functions, which will raise an error starting with
SciPy 1.14. In some cases, this has delayed the originally announced
removal date, to give time to respond to the second part of the deprecation.
Affected functions are:linalg.{eigh, eigvalsh, pinv}
integrate.simpson
signal.{firls, firwin, firwin2, remez}
sparse.linalg.{bicg, bicgstab, cg, cgs, gcrotmk, gmres, lgmres, minres, qmr, tfqmr}
special.comb
stats.kendalltau
-
All wavelet functions have been deprecated, as PyWavelets provides suitable
implementations; affected functions are:signal.{daub, qmf, cascade, morlet, morlet2, ricker, cwt}
-
scipy.integrate.trapz
,scipy.integrate.cumtrapz
, andscipy.integrate.simps
have
been deprecated in favour ofscipy.integrate.trapezoid
,scipy.integrate.cumulative_trapezoid
,
andscipy.integrate.simpson
respectively and will be removed in SciPy 1.14. -
The
tol
argument ofscipy.sparse.linalg.{bcg,bicstab,cg,cgs,gcrotmk,gmres,lgmres,minres,qmr,tfqmr}
is now deprecated in favour ofrtol
and will be removed in SciPy 1.14.
Furthermore, the default value ofatol
for these functions is due
to change to0.0
in SciPy 1.14.
Expired Deprecations
There is an ongoing effort to follow through on long-standing deprecations.
The following previously deprecated features are affected:
- The
centered
keyword ofscipy.stats.qmc.LatinHypercube
has been removed.
Usescrambled=False
instead ofcentered=True
. scipy.stats.binom_test
has been removed in favour ofscipy.stats.binomtest
.- In
scipy.stats.iqr
, the use ofscale='raw'
has been removed in favour
ofscale=1
.
Backwards incompatible changes
Other changes
- The arguments used to compile and link SciPy are now available via
show_config
.
Authors
- Name (commits)
- endolith (1)
- h-vetinari (32)
- Tom Adamczewski (3) +
- Anudeep Adiraju (1) +
- akeemlh (1)
- Alex Amadori (2) +
- Raja Yashwanth Avantsa (2) +
- Seth Axen (1) +
- Ross Barnowski (1)
- Dan Barzilay (1) +
- Ashish Bastola (1) +
- Christoph Baumgarten (2)
- Ben Beasley (3) +
- Doron Behar (1)
- Peter Bell (1)
- Sebastian Berg (1)
- Ben Boeckel (1) +
- David Boetius (1) +
- Matt Borland (1)
- Jake Bowhay (103)
- Larry Bradley (1) +
- Dietrich Brunn (5)
- Evgeni Burovski (102)
- Matthias Bussonnier (18)
- CJ Carey (6)
- Colin Carroll (1) +
- Aadya Chinubhai (1) +
- Luca Citi (1)
- Lucas Colley (141) +
- com3dian (1) +
- Anirudh Dagar (4)
- Danni (1) +
- Dieter Werthmüller (1)
- John Doe (2) +
- Philippe DONNAT (2) +
- drestebon (1) +
- Thomas Duvernay (1)
- elbarso (1) +
- emilfrost (2) +
- Paul Estano (8) +
- Evandro (2)
- Franz Király (1) +
- Nikita Furin (1) +
- gabrielthomsen (1) +
- Lukas Geiger (9) +
- Artem Glebov (22) +
- Caden Gobat (1)
- Ralf Gommers (126)
- Alexander Goscinski (2) +
- Rohit Goswami (2) +
- Olivier Grisel (1)
- Matt Haberland (243)
- Charles Harris (1)
- harshilkamdar (1) +
- Alon Hovav (2) +
- Gert-Ludwig Ingold (1)
- Romain Jacob (1) +
- jcwhitehead (1) +
- Julien Jerphanion (13)
- He Jia (1)
- JohnWT (1) +
- jokasimr (1) +
- Evan W Jones (1)
- Karen Róbertsdóttir (1) +
- Ganesh Kathiresan (1)
- Robert Kern (11)
- Andrew Knyazev (4)
- Uwe L. Korn (1) +
- Rishi Kulkarni (1)
- Kale Kundert (3) +
- Jozsef Kutas (2)
- Kyle0 (2) +
- Robert Langefeld (1) +
- Jeffrey Larson (1) +
- Jessy Lauer (1) +
- lciti (1) +
- Hoang Le (1) +
- Antony Lee (5)
- Thilo Leitzbach (4) +
- LemonBoy (2) +
- Ellie Litwack (8) +
- Thomas Loke (4) +
- Malte Londschien (1) +
- Christian Lorentzen (6)
- Adam Lugowski (10) +
- lutefiskhotdish (1)
- mainak33 (1) +
- Ben Mares (11) +
- mart-mihkel (2) +
- Mateusz Sokół (24) +
- Nikolay Mayorov (4)
- Nicholas McKibben (1)
- Melissa Weber Mendonça (7)
- Michał Górny (1)
- Kat Mistberg (2) +
- mkiffer (1) +
- mocquin (1) +
- Nicolas Mokus (2) +
- Sturla Molden (1)
- Roberto Pastor Muela (3) +
- Bijay Nayak (1) +
- Andrew Nelson (105)
- Praveer Nidamaluri (3) +
- Lysandros Nikolaou (2)
- Dimitri Papadopoulos Orfanos (7)
- Pablo Rodríguez Pérez (1) +
- Dimitri Papadopoulos (2)
- Tirth Patel (14)
- Kyle Paterson (1) +
- Paul (4) +
- Yann Pellegrini (2) +
- Matti Picus (4)
- Ilhan Polat (36)
- Pranav (1) +
- Bharat Raghunathan (1)
- Chris Rapson (1) +
- Matteo Raso (4)
- Tyler Reddy (201)
- Martin Reinecke (1)
- Tilo Reneau-Cardoso (1) +
- resting-dove (2) +
- Simon Segerblom Rex (4)
- Lucas Roberts (2)
- Pamphile Roy (31)
- Feras Saad (3) +
- Atsushi Sakai (3)
- Masahiro Sakai (2) +
- Omar Salman (14)
- Andrej Savikin (1) +
- Daniel Schmitz (54)
- Dan Schult (19)
- Scott Shambaugh (9)
- Sheila-nk (2) +
- Mauro Silberberg (3) +
- Maciej Skorski (1) +
- Laurent Sorber (1) +
- Albert Steppi (28)
- Kai Striega (1)
- Saswat Susmoy (1) +
- Alex Szatmary (1) +
- Søren Fuglede Jørgensen (3)
- othmane tamri (3) +
- Ewout ter Hoeven (1)
- Will Tirone (1)
- TLeitzbach (1) +
- Kevin Topolski (1) +
- Edgar Andrés Margffoy Tuay (1)
- Dipansh Uikey (1) +
- Matus Valo (3)
- Christian Veenhuis (2)
- Nicolas Vetsch (1) +
- Isaac Virshup (7)
- Hielke Walinga (2) +
- Stefan van der Walt (2)
- Warren Weckesser (7)
- Bernhard M. Wiedemann (4)
- Levi John Wolf (1)
- Xuefeng Xu (4) +
- Rory Yorke (2)
- YoussefAli1 (1) +
- Irwin Zaid (4) +
- Jinzhe Zeng (1) +
- JIMMY ZHAO (1) +
A total of 163 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.