scipy 1.15.3__cp313-cp313t-win_amd64.whl → 1.16.0rc2__cp313-cp313t-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipy/__config__.py +7 -7
- scipy/__init__.py +3 -6
- scipy/_cyutility.cp313t-win_amd64.dll.a +0 -0
- scipy/_cyutility.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_array_api.py +486 -161
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_bunch.py +4 -0
- scipy/_lib/_ccallback_c.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_ccallback_c.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_fpumode.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_fpumode.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_test_ccallback.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_call.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_test_deprecation_def.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_testutils.py +6 -2
- scipy/_lib/_uarray/_uarray.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/_uarray/_uarray.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/_util.py +222 -125
- scipy/_lib/array_api_compat/__init__.py +4 -4
- scipy/_lib/array_api_compat/_internal.py +19 -6
- scipy/_lib/array_api_compat/common/__init__.py +1 -1
- scipy/_lib/array_api_compat/common/_aliases.py +365 -193
- scipy/_lib/array_api_compat/common/_fft.py +94 -64
- scipy/_lib/array_api_compat/common/_helpers.py +413 -180
- scipy/_lib/array_api_compat/common/_linalg.py +116 -40
- scipy/_lib/array_api_compat/common/_typing.py +179 -10
- scipy/_lib/array_api_compat/cupy/__init__.py +1 -4
- scipy/_lib/array_api_compat/cupy/_aliases.py +61 -41
- scipy/_lib/array_api_compat/cupy/_info.py +16 -6
- scipy/_lib/array_api_compat/cupy/_typing.py +24 -39
- scipy/_lib/array_api_compat/dask/array/__init__.py +6 -3
- scipy/_lib/array_api_compat/dask/array/_aliases.py +267 -108
- scipy/_lib/array_api_compat/dask/array/_info.py +105 -34
- scipy/_lib/array_api_compat/dask/array/fft.py +5 -8
- scipy/_lib/array_api_compat/dask/array/linalg.py +21 -22
- scipy/_lib/array_api_compat/numpy/__init__.py +13 -15
- scipy/_lib/array_api_compat/numpy/_aliases.py +98 -49
- scipy/_lib/array_api_compat/numpy/_info.py +36 -16
- scipy/_lib/array_api_compat/numpy/_typing.py +27 -43
- scipy/_lib/array_api_compat/numpy/fft.py +11 -5
- scipy/_lib/array_api_compat/numpy/linalg.py +75 -22
- scipy/_lib/array_api_compat/torch/__init__.py +3 -5
- scipy/_lib/array_api_compat/torch/_aliases.py +262 -159
- scipy/_lib/array_api_compat/torch/_info.py +27 -16
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +17 -18
- scipy/_lib/array_api_compat/torch/linalg.py +16 -16
- scipy/_lib/array_api_extra/__init__.py +26 -3
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/decorator.py +2 -2
- scipy/_lib/doccer.py +1 -7
- scipy/_lib/messagestream.cp313t-win_amd64.dll.a +0 -0
- scipy/_lib/messagestream.cp313t-win_amd64.pyd +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/test__util.py +105 -121
- scipy/_lib/tests/test_array_api.py +166 -35
- scipy/_lib/tests/test_bunch.py +7 -0
- scipy/_lib/tests/test_ccallback.py +2 -10
- scipy/_lib/tests/test_public_api.py +13 -0
- scipy/cluster/_hierarchy.cp313t-win_amd64.dll.a +0 -0
- scipy/cluster/_hierarchy.cp313t-win_amd64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.dll.a +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp313t-win_amd64.pyd +0 -0
- scipy/cluster/_vq.cp313t-win_amd64.dll.a +0 -0
- scipy/cluster/_vq.cp313t-win_amd64.pyd +0 -0
- scipy/cluster/hierarchy.py +393 -223
- scipy/cluster/tests/test_hierarchy.py +273 -335
- scipy/cluster/tests/test_vq.py +45 -61
- scipy/cluster/vq.py +39 -35
- scipy/conftest.py +263 -157
- scipy/constants/_constants.py +4 -1
- scipy/constants/tests/test_codata.py +2 -2
- scipy/constants/tests/test_constants.py +11 -18
- scipy/datasets/_download_all.py +15 -1
- scipy/datasets/_fetchers.py +7 -1
- scipy/datasets/_utils.py +1 -1
- scipy/differentiate/_differentiate.py +25 -25
- scipy/differentiate/tests/test_differentiate.py +24 -25
- scipy/fft/_basic.py +20 -0
- scipy/fft/_helper.py +3 -34
- scipy/fft/_pocketfft/helper.py +29 -1
- scipy/fft/_pocketfft/pypocketfft.cp313t-win_amd64.dll.a +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp313t-win_amd64.pyd +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +2 -4
- scipy/fft/_pocketfft/tests/test_real_transforms.py +4 -4
- scipy/fft/_realtransforms.py +13 -0
- scipy/fft/tests/test_basic.py +27 -25
- scipy/fft/tests/test_fftlog.py +16 -7
- scipy/fft/tests/test_helper.py +18 -34
- scipy/fft/tests/test_real_transforms.py +8 -10
- scipy/fftpack/convolve.cp313t-win_amd64.dll.a +0 -0
- scipy/fftpack/convolve.cp313t-win_amd64.pyd +0 -0
- scipy/fftpack/tests/test_basic.py +2 -4
- scipy/fftpack/tests/test_real_transforms.py +8 -9
- scipy/integrate/_bvp.py +9 -3
- scipy/integrate/_cubature.py +3 -2
- scipy/integrate/_dop.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_dop.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_lsoda.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_lsoda.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_odepack.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_quadpack.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_quadpack_py.py +11 -7
- scipy/integrate/_quadrature.py +3 -3
- scipy/integrate/_rules/_base.py +2 -2
- scipy/integrate/_tanhsinh.py +48 -47
- scipy/integrate/_test_multivariate.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_test_multivariate.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_test_odeint_banded.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/_vode.cp313t-win_amd64.dll.a +0 -0
- scipy/integrate/_vode.cp313t-win_amd64.pyd +0 -0
- scipy/integrate/tests/test__quad_vec.py +0 -6
- scipy/integrate/tests/test_banded_ode_solvers.py +85 -0
- scipy/integrate/tests/test_cubature.py +21 -35
- scipy/integrate/tests/test_quadrature.py +6 -8
- scipy/integrate/tests/test_tanhsinh.py +56 -48
- scipy/interpolate/__init__.py +70 -58
- scipy/interpolate/_bary_rational.py +22 -22
- scipy/interpolate/_bsplines.py +119 -66
- scipy/interpolate/_cubic.py +65 -50
- scipy/interpolate/_dfitpack.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_dfitpack.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_dierckx.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_dierckx.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_fitpack.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_fitpack.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_fitpack2.py +9 -6
- scipy/interpolate/_fitpack_impl.py +32 -26
- scipy/interpolate/_fitpack_repro.py +23 -19
- scipy/interpolate/_interpnd.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_interpnd.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_interpolate.py +30 -12
- scipy/interpolate/_ndbspline.py +13 -18
- scipy/interpolate/_ndgriddata.py +5 -8
- scipy/interpolate/_polyint.py +95 -31
- scipy/interpolate/_ppoly.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_ppoly.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_rgi_cython.cp313t-win_amd64.pyd +0 -0
- scipy/interpolate/dfitpack.py +0 -20
- scipy/interpolate/interpnd.py +1 -2
- scipy/interpolate/tests/test_bary_rational.py +2 -2
- scipy/interpolate/tests/test_bsplines.py +97 -1
- scipy/interpolate/tests/test_fitpack2.py +39 -1
- scipy/interpolate/tests/test_interpnd.py +32 -20
- scipy/interpolate/tests/test_interpolate.py +48 -4
- scipy/interpolate/tests/test_rgi.py +2 -1
- scipy/io/_fast_matrix_market/__init__.py +2 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp313t-win_amd64.dll.a +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp313t-win_amd64.pyd +0 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +19 -16
- scipy/io/_harwell_boeing/hb.py +7 -11
- scipy/io/_idl.py +5 -7
- scipy/io/_netcdf.py +15 -5
- scipy/io/_test_fortran.cp313t-win_amd64.dll.a +0 -0
- scipy/io/_test_fortran.cp313t-win_amd64.pyd +0 -0
- scipy/io/arff/tests/test_arffread.py +3 -3
- scipy/io/matlab/__init__.py +5 -3
- scipy/io/matlab/_mio.py +4 -1
- scipy/io/matlab/_mio5.py +19 -13
- scipy/io/matlab/_mio5_utils.cp313t-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio5_utils.cp313t-win_amd64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp313t-win_amd64.dll.a +0 -0
- scipy/io/matlab/_mio_utils.cp313t-win_amd64.pyd +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cp313t-win_amd64.dll.a +0 -0
- scipy/io/matlab/_streams.cp313t-win_amd64.pyd +0 -0
- scipy/io/matlab/tests/test_mio.py +46 -18
- scipy/io/matlab/tests/test_mio_funcs.py +1 -1
- scipy/io/tests/test_mmio.py +7 -1
- scipy/io/tests/test_wavfile.py +41 -0
- scipy/io/wavfile.py +57 -10
- scipy/linalg/_basic.py +113 -86
- scipy/linalg/_cythonized_array_utils.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_cythonized_array_utils.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_decomp.py +22 -9
- scipy/linalg/_decomp_cholesky.py +28 -13
- scipy/linalg/_decomp_cossin.py +45 -30
- scipy/linalg/_decomp_interpolative.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_interpolative.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_lu_cython.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_decomp_polar.py +2 -0
- scipy/linalg/_decomp_qr.py +6 -2
- scipy/linalg/_decomp_qz.py +3 -0
- scipy/linalg/_decomp_schur.py +3 -1
- scipy/linalg/_decomp_svd.py +13 -2
- scipy/linalg/_decomp_update.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_decomp_update.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_fblas.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_flapack.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_flapack.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_linalg_pythran.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_linalg_pythran.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_expm.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/_solve_toeplitz.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/cython_blas.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/cython_lapack.cp313t-win_amd64.dll.a +0 -0
- scipy/linalg/cython_lapack.cp313t-win_amd64.pyd +0 -0
- scipy/linalg/lapack.py +22 -2
- scipy/linalg/tests/_cython_examples/meson.build +7 -0
- scipy/linalg/tests/test_basic.py +31 -16
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +0 -2
- scipy/linalg/tests/test_decomp.py +40 -3
- scipy/linalg/tests/test_decomp_cossin.py +14 -0
- scipy/linalg/tests/test_decomp_ldl.py +1 -1
- scipy/linalg/tests/test_lapack.py +115 -7
- scipy/linalg/tests/test_matfuncs.py +157 -102
- scipy/linalg/tests/test_procrustes.py +0 -7
- scipy/linalg/tests/test_solve_toeplitz.py +1 -1
- scipy/linalg/tests/test_special_matrices.py +1 -5
- scipy/ndimage/__init__.py +1 -0
- scipy/ndimage/_ctest.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_ctest.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_cytest.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_cytest.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_delegators.py +8 -2
- scipy/ndimage/_filters.py +453 -5
- scipy/ndimage/_interpolation.py +36 -6
- scipy/ndimage/_measurements.py +4 -2
- scipy/ndimage/_morphology.py +5 -0
- scipy/ndimage/_nd_image.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_nd_image.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_ni_label.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cp313t-win_amd64.dll.a +0 -0
- scipy/ndimage/_rank_filter_1d.cp313t-win_amd64.pyd +0 -0
- scipy/ndimage/_support_alternative_backends.py +18 -6
- scipy/ndimage/tests/test_filters.py +370 -259
- scipy/ndimage/tests/test_fourier.py +7 -9
- scipy/ndimage/tests/test_interpolation.py +68 -61
- scipy/ndimage/tests/test_measurements.py +18 -35
- scipy/ndimage/tests/test_morphology.py +143 -131
- scipy/ndimage/tests/test_splines.py +1 -3
- scipy/odr/__odrpack.cp313t-win_amd64.dll.a +0 -0
- scipy/odr/__odrpack.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_bglu_dense.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_bracket.py +17 -24
- scipy/optimize/_chandrupatla.py +9 -10
- scipy/optimize/_cobyla_py.py +104 -123
- scipy/optimize/_constraints.py +14 -10
- scipy/optimize/_differentiable_functions.py +371 -230
- scipy/optimize/_differentialevolution.py +4 -3
- scipy/optimize/_direct.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_direct.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_group_columns.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_core.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_core.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_highspy/_highs_options.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_lbfgsb.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_lbfgsb.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_lbfgsb_py.py +57 -16
- scipy/optimize/_linprog_doc.py +2 -2
- scipy/optimize/_linprog_highs.py +2 -2
- scipy/optimize/_linprog_ip.py +25 -10
- scipy/optimize/_linprog_util.py +14 -16
- scipy/optimize/_lsap.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_lsap.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_lsq/givens_elimination.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_lsq/least_squares.py +198 -126
- scipy/optimize/_lsq/lsq_linear.py +6 -6
- scipy/optimize/_lsq/trf.py +35 -8
- scipy/optimize/_milp.py +3 -1
- scipy/optimize/_minimize.py +105 -36
- scipy/optimize/_minpack.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_minpack.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_moduleTNC.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_nnls.py +20 -21
- scipy/optimize/_nonlin.py +34 -3
- scipy/optimize/_numdiff.py +288 -110
- scipy/optimize/_optimize.py +86 -48
- scipy/optimize/_pava_pybind.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_pava_pybind.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_remove_redundancy.py +5 -5
- scipy/optimize/_root_scalar.py +1 -1
- scipy/optimize/_shgo.py +6 -0
- scipy/optimize/_shgo_lib/_complex.py +1 -1
- scipy/optimize/_slsqp_py.py +216 -124
- scipy/optimize/_slsqplib.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqplib.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_trlib/_trlib.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_trustregion.py +20 -6
- scipy/optimize/_trustregion_constr/canonical_constraint.py +7 -7
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +1 -1
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +11 -3
- scipy/optimize/_trustregion_constr/projections.py +12 -8
- scipy/optimize/_trustregion_constr/qp_subproblem.py +9 -9
- scipy/optimize/_trustregion_constr/tests/test_projections.py +7 -7
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +77 -77
- scipy/optimize/_trustregion_constr/tr_interior_point.py +5 -5
- scipy/optimize/_trustregion_exact.py +0 -1
- scipy/optimize/_zeros.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_zeros.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/cython_optimize/_zeros.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/slsqp.py +0 -1
- scipy/optimize/tests/test__basinhopping.py +1 -1
- scipy/optimize/tests/test__differential_evolution.py +4 -4
- scipy/optimize/tests/test__linprog_clean_inputs.py +5 -3
- scipy/optimize/tests/test__numdiff.py +66 -22
- scipy/optimize/tests/test__remove_redundancy.py +2 -2
- scipy/optimize/tests/test__shgo.py +9 -1
- scipy/optimize/tests/test_bracket.py +36 -46
- scipy/optimize/tests/test_chandrupatla.py +133 -135
- scipy/optimize/tests/test_cobyla.py +74 -45
- scipy/optimize/tests/test_constraints.py +1 -1
- scipy/optimize/tests/test_differentiable_functions.py +226 -6
- scipy/optimize/tests/test_lbfgsb_hessinv.py +22 -0
- scipy/optimize/tests/test_least_squares.py +125 -13
- scipy/optimize/tests/test_linear_assignment.py +3 -3
- scipy/optimize/tests/test_linprog.py +3 -3
- scipy/optimize/tests/test_lsq_linear.py +6 -6
- scipy/optimize/tests/test_minimize_constrained.py +2 -2
- scipy/optimize/tests/test_minpack.py +4 -4
- scipy/optimize/tests/test_nnls.py +43 -3
- scipy/optimize/tests/test_nonlin.py +36 -0
- scipy/optimize/tests/test_optimize.py +95 -17
- scipy/optimize/tests/test_slsqp.py +36 -4
- scipy/optimize/tests/test_zeros.py +34 -1
- scipy/signal/__init__.py +12 -23
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +459 -241
- scipy/signal/_fir_filter_design.py +262 -90
- scipy/signal/_lti_conversion.py +3 -2
- scipy/signal/_ltisys.py +118 -91
- scipy/signal/_max_len_seq_inner.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_max_len_seq_inner.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_peak_finding_utils.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_peak_finding_utils.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_short_time_fft.py +519 -70
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +719 -399
- scipy/signal/_sigtools.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_sigtools.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_sosfilt.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_sosfilt.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_spline.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_spline_filters.py +108 -68
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +4 -1
- scipy/signal/_upfirdn_apply.cp313t-win_amd64.dll.a +0 -0
- scipy/signal/_upfirdn_apply.cp313t-win_amd64.pyd +0 -0
- scipy/signal/_waveforms.py +2 -11
- scipy/signal/_wavelets.py +1 -1
- scipy/signal/fir_filter_design.py +1 -0
- scipy/signal/spline.py +4 -11
- scipy/signal/tests/_scipy_spectral_test_shim.py +2 -171
- scipy/signal/tests/test_bsplines.py +114 -79
- scipy/signal/tests/test_cont2discrete.py +9 -2
- scipy/signal/tests/test_filter_design.py +721 -481
- scipy/signal/tests/test_fir_filter_design.py +332 -140
- scipy/signal/tests/test_savitzky_golay.py +4 -3
- scipy/signal/tests/test_short_time_fft.py +221 -3
- scipy/signal/tests/test_signaltools.py +2144 -1348
- scipy/signal/tests/test_spectral.py +50 -6
- scipy/signal/tests/test_splines.py +161 -96
- scipy/signal/tests/test_upfirdn.py +84 -50
- scipy/signal/tests/test_waveforms.py +20 -0
- scipy/signal/tests/test_windows.py +607 -466
- scipy/signal/windows/_windows.py +287 -148
- scipy/sparse/__init__.py +23 -4
- scipy/sparse/_base.py +270 -108
- scipy/sparse/_bsr.py +7 -4
- scipy/sparse/_compressed.py +59 -231
- scipy/sparse/_construct.py +90 -38
- scipy/sparse/_coo.py +115 -181
- scipy/sparse/_csc.py +4 -4
- scipy/sparse/_csparsetools.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/_csparsetools.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/_csr.py +2 -2
- scipy/sparse/_data.py +48 -48
- scipy/sparse/_dia.py +105 -18
- scipy/sparse/_dok.py +0 -23
- scipy/sparse/_index.py +4 -4
- scipy/sparse/_matrix.py +23 -0
- scipy/sparse/_sparsetools.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/_sparsetools.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/_sputils.py +37 -22
- scipy/sparse/base.py +0 -9
- scipy/sparse/bsr.py +0 -14
- scipy/sparse/compressed.py +0 -23
- scipy/sparse/construct.py +0 -6
- scipy/sparse/coo.py +0 -14
- scipy/sparse/csc.py +0 -3
- scipy/sparse/csgraph/_flow.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_flow.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_matching.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_matching.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_reordering.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_shortest_path.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_tools.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/csgraph/_traversal.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/csgraph/tests/test_matching.py +14 -2
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +4 -1
- scipy/sparse/csgraph/tests/test_shortest_path.py +83 -27
- scipy/sparse/csr.py +0 -5
- scipy/sparse/data.py +1 -6
- scipy/sparse/dia.py +0 -7
- scipy/sparse/dok.py +0 -10
- scipy/sparse/linalg/_dsolve/_superlu.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +9 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +35 -28
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +23 -17
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +6 -6
- scipy/sparse/linalg/_interface.py +17 -18
- scipy/sparse/linalg/_isolve/_gcrotmk.py +4 -4
- scipy/sparse/linalg/_isolve/iterative.py +51 -45
- scipy/sparse/linalg/_isolve/lgmres.py +6 -6
- scipy/sparse/linalg/_isolve/minres.py +5 -5
- scipy/sparse/linalg/_isolve/tfqmr.py +7 -7
- scipy/sparse/linalg/_isolve/utils.py +2 -8
- scipy/sparse/linalg/_matfuncs.py +1 -1
- scipy/sparse/linalg/_norm.py +1 -1
- scipy/sparse/linalg/_propack/_cpropack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp313t-win_amd64.dll.a +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp313t-win_amd64.pyd +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +39 -38
- scipy/sparse/linalg/tests/test_pydata_sparse.py +14 -0
- scipy/sparse/tests/test_arithmetic1d.py +5 -2
- scipy/sparse/tests/test_base.py +214 -42
- scipy/sparse/tests/test_common1d.py +7 -7
- scipy/sparse/tests/test_construct.py +1 -1
- scipy/sparse/tests/test_coo.py +272 -4
- scipy/sparse/tests/test_sparsetools.py +5 -0
- scipy/sparse/tests/test_sputils.py +36 -7
- scipy/spatial/_ckdtree.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_ckdtree.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_pybind.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_distance_wrap.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_hausdorff.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_hausdorff.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_qhull.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_qhull.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/_voronoi.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/_voronoi.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/distance.py +49 -42
- scipy/spatial/tests/test_distance.py +15 -1
- scipy/spatial/tests/test_kdtree.py +1 -0
- scipy/spatial/tests/test_qhull.py +7 -2
- scipy/spatial/transform/__init__.py +5 -3
- scipy/spatial/transform/_rigid_transform.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rigid_transform.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp313t-win_amd64.dll.a +0 -0
- scipy/spatial/transform/_rotation.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +1213 -832
- scipy/spatial/transform/tests/test_rotation_groups.py +3 -3
- scipy/spatial/transform/tests/test_rotation_spline.py +29 -8
- scipy/special/__init__.py +1 -47
- scipy/special/_add_newdocs.py +34 -772
- scipy/special/_basic.py +22 -25
- scipy/special/_comb.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_comb.cp313t-win_amd64.pyd +0 -0
- scipy/special/_ellip_harm_2.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_ellip_harm_2.cp313t-win_amd64.pyd +0 -0
- scipy/special/_gufuncs.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_gufuncs.cp313t-win_amd64.pyd +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_specfun.cp313t-win_amd64.pyd +0 -0
- scipy/special/_special_ufuncs.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_special_ufuncs.cp313t-win_amd64.pyd +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_test_internal.cp313t-win_amd64.pyd +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs.cp313t-win_amd64.pyd +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cp313t-win_amd64.dll.a +0 -0
- scipy/special/_ufuncs_cxx.cp313t-win_amd64.pyd +0 -0
- scipy/special/_ufuncs_cxx.pxd +2 -15
- scipy/special/_ufuncs_cxx.pyx +5 -44
- scipy/special/_ufuncs_cxx_defs.h +2 -16
- scipy/special/_ufuncs_defs.h +0 -8
- scipy/special/cython_special.cp313t-win_amd64.dll.a +0 -0
- scipy/special/cython_special.cp313t-win_amd64.pyd +0 -0
- scipy/special/cython_special.pxd +1 -1
- scipy/special/tests/_cython_examples/meson.build +10 -1
- scipy/special/tests/test_basic.py +153 -20
- scipy/special/tests/test_boost_ufuncs.py +3 -0
- scipy/special/tests/test_cdflib.py +35 -11
- scipy/special/tests/test_gammainc.py +16 -0
- scipy/special/tests/test_hyp2f1.py +2 -2
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_logsumexp.py +206 -64
- scipy/special/tests/test_mpmath.py +1 -0
- scipy/special/tests/test_nan_inputs.py +1 -1
- scipy/special/tests/test_orthogonal.py +17 -18
- scipy/special/tests/test_sf_error.py +3 -2
- scipy/special/tests/test_sph_harm.py +6 -7
- scipy/special/tests/test_support_alternative_backends.py +211 -76
- scipy/stats/__init__.py +4 -1
- scipy/stats/_ansari_swilk_statistics.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_ansari_swilk_statistics.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_biasedurn.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +277 -310
- scipy/stats/_correlation.py +1 -1
- scipy/stats/_covariance.py +6 -3
- scipy/stats/_discrete_distns.py +39 -32
- scipy/stats/_distn_infrastructure.py +39 -12
- scipy/stats/_distribution_infrastructure.py +900 -238
- scipy/stats/_entropy.py +9 -10
- scipy/{_lib → stats}/_finite_differences.py +1 -1
- scipy/stats/_hypotests.py +83 -50
- scipy/stats/_kde.py +53 -49
- scipy/stats/_ksstats.py +1 -1
- scipy/stats/_levy_stable/__init__.py +7 -15
- scipy/stats/_levy_stable/levyst.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_levy_stable/levyst.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_morestats.py +118 -73
- scipy/stats/_mstats_basic.py +13 -17
- scipy/stats/_mstats_extras.py +8 -8
- scipy/stats/_multivariate.py +89 -113
- scipy/stats/_new_distributions.py +97 -20
- scipy/stats/_page_trend_test.py +12 -5
- scipy/stats/_probability_distribution.py +265 -43
- scipy/stats/_qmc.py +14 -9
- scipy/stats/_qmc_cy.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_qmc_cy.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_qmvnt_cy.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_rcont/rcont.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_sobol.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_stats.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_stats.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_stats_pythran.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp313t-win_amd64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +2 -1
- scipy/stats/_variation.py +6 -8
- scipy/stats/_wilcoxon.py +13 -7
- scipy/stats/tests/common_tests.py +6 -4
- scipy/stats/tests/test_axis_nan_policy.py +62 -24
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +379 -60
- scipy/stats/tests/test_continuous_basic.py +18 -12
- scipy/stats/tests/test_discrete_basic.py +14 -8
- scipy/stats/tests/test_discrete_distns.py +16 -16
- scipy/stats/tests/test_distributions.py +95 -75
- scipy/stats/tests/test_entropy.py +40 -48
- scipy/stats/tests/test_fit.py +4 -3
- scipy/stats/tests/test_hypotests.py +153 -24
- scipy/stats/tests/test_kdeoth.py +109 -41
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_morestats.py +79 -47
- scipy/stats/tests/test_mstats_basic.py +3 -3
- scipy/stats/tests/test_multivariate.py +434 -83
- scipy/stats/tests/test_qmc.py +13 -10
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +119 -112
- scipy/stats/tests/test_resampling.py +47 -56
- scipy/stats/tests/test_sampling.py +9 -4
- scipy/stats/tests/test_stats.py +799 -939
- scipy/stats/tests/test_variation.py +8 -6
- scipy/version.py +2 -2
- scipy-1.16.0rc2.dist-info/DELVEWHEEL +2 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/LICENSE.txt +4 -4
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/METADATA +11 -11
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/RECORD +685 -693
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cp313t-win_amd64.dll.a +0 -0
- scipy/interpolate/_bspl.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_cobyla.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_cobyla.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_cython_nnls.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_cython_nnls.cp313t-win_amd64.pyd +0 -0
- scipy/optimize/_slsqp.cp313t-win_amd64.dll.a +0 -0
- scipy/optimize/_slsqp.cp313t-win_amd64.pyd +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dll +0 -0
- scipy/special/libsf_error_state.dll.a +0 -0
- scipy/special/tests/test_log_softmax.py +0 -109
- scipy/special/tests/test_xsf_cuda.py +0 -114
- scipy/special/xsf/binom.h +0 -89
- scipy/special/xsf/cdflib.h +0 -100
- scipy/special/xsf/cephes/airy.h +0 -307
- scipy/special/xsf/cephes/besselpoly.h +0 -51
- scipy/special/xsf/cephes/beta.h +0 -257
- scipy/special/xsf/cephes/cbrt.h +0 -131
- scipy/special/xsf/cephes/chbevl.h +0 -85
- scipy/special/xsf/cephes/chdtr.h +0 -193
- scipy/special/xsf/cephes/const.h +0 -87
- scipy/special/xsf/cephes/ellie.h +0 -293
- scipy/special/xsf/cephes/ellik.h +0 -251
- scipy/special/xsf/cephes/ellpe.h +0 -107
- scipy/special/xsf/cephes/ellpk.h +0 -117
- scipy/special/xsf/cephes/expn.h +0 -260
- scipy/special/xsf/cephes/gamma.h +0 -398
- scipy/special/xsf/cephes/hyp2f1.h +0 -596
- scipy/special/xsf/cephes/hyperg.h +0 -361
- scipy/special/xsf/cephes/i0.h +0 -149
- scipy/special/xsf/cephes/i1.h +0 -158
- scipy/special/xsf/cephes/igam.h +0 -421
- scipy/special/xsf/cephes/igam_asymp_coeff.h +0 -195
- scipy/special/xsf/cephes/igami.h +0 -313
- scipy/special/xsf/cephes/j0.h +0 -225
- scipy/special/xsf/cephes/j1.h +0 -198
- scipy/special/xsf/cephes/jv.h +0 -715
- scipy/special/xsf/cephes/k0.h +0 -164
- scipy/special/xsf/cephes/k1.h +0 -163
- scipy/special/xsf/cephes/kn.h +0 -243
- scipy/special/xsf/cephes/lanczos.h +0 -112
- scipy/special/xsf/cephes/ndtr.h +0 -275
- scipy/special/xsf/cephes/poch.h +0 -85
- scipy/special/xsf/cephes/polevl.h +0 -167
- scipy/special/xsf/cephes/psi.h +0 -194
- scipy/special/xsf/cephes/rgamma.h +0 -111
- scipy/special/xsf/cephes/scipy_iv.h +0 -811
- scipy/special/xsf/cephes/shichi.h +0 -248
- scipy/special/xsf/cephes/sici.h +0 -224
- scipy/special/xsf/cephes/sindg.h +0 -221
- scipy/special/xsf/cephes/tandg.h +0 -139
- scipy/special/xsf/cephes/trig.h +0 -58
- scipy/special/xsf/cephes/unity.h +0 -186
- scipy/special/xsf/cephes/zeta.h +0 -172
- scipy/special/xsf/config.h +0 -304
- scipy/special/xsf/digamma.h +0 -205
- scipy/special/xsf/error.h +0 -57
- scipy/special/xsf/evalpoly.h +0 -47
- scipy/special/xsf/expint.h +0 -266
- scipy/special/xsf/hyp2f1.h +0 -694
- scipy/special/xsf/iv_ratio.h +0 -173
- scipy/special/xsf/lambertw.h +0 -150
- scipy/special/xsf/loggamma.h +0 -163
- scipy/special/xsf/sici.h +0 -200
- scipy/special/xsf/tools.h +0 -427
- scipy/special/xsf/trig.h +0 -164
- scipy/special/xsf/wright_bessel.h +0 -843
- scipy/special/xsf/zlog1.h +0 -35
- scipy/stats/_mvn.cp313t-win_amd64.dll.a +0 -0
- scipy/stats/_mvn.cp313t-win_amd64.pyd +0 -0
- scipy-1.15.3.dist-info/DELVEWHEEL +0 -2
- /scipy-1.15.3-cp313-cp313t-win_amd64.whl → /scipy-1.16.0rc2-cp313-cp313t-win_amd64.whl +0 -0
- {scipy-1.15.3.dist-info → scipy-1.16.0rc2.dist-info}/WHEEL +0 -0
Binary file
|
Binary file
|
Binary file
|
Binary file
|
scipy/signal/_spectral_py.py
CHANGED
@@ -4,10 +4,11 @@ import numpy as np
|
|
4
4
|
import numpy.typing as npt
|
5
5
|
from scipy import fft as sp_fft
|
6
6
|
from . import _signaltools
|
7
|
+
from ._short_time_fft import ShortTimeFFT, FFT_MODE_TYPE
|
7
8
|
from .windows import get_window
|
8
9
|
from ._arraytools import const_ext, even_ext, odd_ext, zero_ext
|
9
10
|
import warnings
|
10
|
-
from typing import Literal
|
11
|
+
from typing import cast, Literal
|
11
12
|
|
12
13
|
|
13
14
|
__all__ = ['periodogram', 'welch', 'lombscargle', 'csd', 'coherence',
|
@@ -377,8 +378,8 @@ def periodogram(x, fs=1.0, window='boxcar', nfft=None, detrend='constant',
|
|
377
378
|
complex data, a two-sided spectrum is always returned.
|
378
379
|
scaling : { 'density', 'spectrum' }, optional
|
379
380
|
Selects between computing the power spectral density ('density')
|
380
|
-
where `Pxx` has units of V
|
381
|
-
spectrum ('spectrum') where `Pxx` has units of V
|
381
|
+
where `Pxx` has units of V²/Hz and computing the squared magnitude
|
382
|
+
spectrum ('spectrum') where `Pxx` has units of V², if `x`
|
382
383
|
is measured in V and `fs` is measured in Hz. Defaults to
|
383
384
|
'density'
|
384
385
|
axis : int, optional
|
@@ -399,6 +400,12 @@ def periodogram(x, fs=1.0, window='boxcar', nfft=None, detrend='constant',
|
|
399
400
|
|
400
401
|
Notes
|
401
402
|
-----
|
403
|
+
The ratio of the squared magnitude (``scaling='spectrum'``) divided by the spectral
|
404
|
+
power density (``scaling='density'``) is the constant factor of
|
405
|
+
``sum(abs(window)**2)*fs / abs(sum(window))**2``.
|
406
|
+
If `return_onesided` is ``True``, the values of the negative frequencies are added
|
407
|
+
to values of the corresponding positive ones.
|
408
|
+
|
402
409
|
Consult the :ref:`tutorial_SpectralAnalysis` section of the :ref:`user_guide`
|
403
410
|
for a discussion of the scalings of the power spectral density and
|
404
411
|
the magnitude (squared) spectrum.
|
@@ -554,6 +561,7 @@ def welch(x, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None,
|
|
554
561
|
|
555
562
|
See Also
|
556
563
|
--------
|
564
|
+
csd: Cross power spectral density using Welch's method
|
557
565
|
periodogram: Simple, optionally modified periodogram
|
558
566
|
lombscargle: Lomb-Scargle periodogram for unevenly sampled data
|
559
567
|
|
@@ -561,12 +569,16 @@ def welch(x, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None,
|
|
561
569
|
-----
|
562
570
|
An appropriate amount of overlap will depend on the choice of window
|
563
571
|
and on your requirements. For the default Hann window an overlap of
|
564
|
-
50% is a reasonable trade
|
572
|
+
50% is a reasonable trade-off between accurately estimating the
|
565
573
|
signal power, while not over counting any of the data. Narrower
|
566
|
-
windows may require a larger overlap.
|
574
|
+
windows may require a larger overlap. If `noverlap` is 0, this
|
575
|
+
method is equivalent to Bartlett's method [2]_.
|
567
576
|
|
568
|
-
|
569
|
-
|
577
|
+
The ratio of the squared magnitude (``scaling='spectrum'``) divided by the spectral
|
578
|
+
power density (``scaling='density'``) is the constant factor of
|
579
|
+
``sum(abs(window)**2)*fs / abs(sum(window))**2``.
|
580
|
+
If `return_onesided` is ``True``, the values of the negative frequencies are added
|
581
|
+
to values of the corresponding positive ones.
|
570
582
|
|
571
583
|
Consult the :ref:`tutorial_SpectralAnalysis` section of the :ref:`user_guide`
|
572
584
|
for a discussion of the scalings of the power spectral density and
|
@@ -685,7 +697,8 @@ def csd(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None,
|
|
685
697
|
length of the window.
|
686
698
|
noverlap: int, optional
|
687
699
|
Number of points to overlap between segments. If `None`,
|
688
|
-
``noverlap = nperseg // 2``. Defaults to `None
|
700
|
+
``noverlap = nperseg // 2``. Defaults to `None` and may
|
701
|
+
not be greater than `nperseg`.
|
689
702
|
nfft : int, optional
|
690
703
|
Length of the FFT used, if a zero padded FFT is desired. If
|
691
704
|
`None`, the FFT length is `nperseg`. Defaults to `None`.
|
@@ -739,13 +752,39 @@ def csd(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None,
|
|
739
752
|
|
740
753
|
An appropriate amount of overlap will depend on the choice of window
|
741
754
|
and on your requirements. For the default Hann window an overlap of
|
742
|
-
50% is a reasonable trade
|
755
|
+
50% is a reasonable trade-off between accurately estimating the
|
743
756
|
signal power, while not over counting any of the data. Narrower
|
744
757
|
windows may require a larger overlap.
|
745
758
|
|
759
|
+
The ratio of the cross spectrum (``scaling='spectrum'``) divided by the cross
|
760
|
+
spectral density (``scaling='density'``) is the constant factor of
|
761
|
+
``sum(abs(window)**2)*fs / abs(sum(window))**2``.
|
762
|
+
If `return_onesided` is ``True``, the values of the negative frequencies are added
|
763
|
+
to values of the corresponding positive ones.
|
764
|
+
|
746
765
|
Consult the :ref:`tutorial_SpectralAnalysis` section of the :ref:`user_guide`
|
747
766
|
for a discussion of the scalings of a spectral density and an (amplitude) spectrum.
|
748
767
|
|
768
|
+
Welch's method may be interpreted as taking the average over the time slices of a
|
769
|
+
(cross-) spectrogram. Internally, this function utilizes the `ShortTimeFFT` to
|
770
|
+
determine the required (cross-) spectrogram. An example below illustrates that it
|
771
|
+
is straightforward to calculate `Pxy` directly with the `ShortTimeFFT`. However,
|
772
|
+
there are some notable differences in the behavior of the `ShortTimeFFT`:
|
773
|
+
|
774
|
+
* There is no direct `ShortTimeFFT` equivalent for the `csd` parameter
|
775
|
+
combination ``return_onesided=True, scaling='density'``, since
|
776
|
+
``fft_mode='onesided2X'`` requires ``'psd'`` scaling. The is due to `csd`
|
777
|
+
returning the doubled squared magnitude in this case, which does not have a
|
778
|
+
sensible interpretation.
|
779
|
+
* `ShortTimeFFT` uses `float64` / `complex128` internally, which is due to the
|
780
|
+
behavior of the utilized `~scipy.fft` module. Thus, those are the dtypes being
|
781
|
+
returned. The `csd` function casts the return values to `float32` / `complex64`
|
782
|
+
if the input is `float32` / `complex64` as well.
|
783
|
+
* The `csd` function calculates ``np.conj(Sx[q,p]) * Sy[q,p]``, whereas
|
784
|
+
`~ShortTimeFFT.spectrogram` calculates ``Sx[q,p] * np.conj(Sy[q,p])`` where
|
785
|
+
``Sx[q,p]``, ``Sy[q,p]`` are the STFTs of `x` and `y`. Also, the window
|
786
|
+
positioning is different.
|
787
|
+
|
749
788
|
.. versionadded:: 0.16.0
|
750
789
|
|
751
790
|
References
|
@@ -759,17 +798,17 @@ def csd(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None,
|
|
759
798
|
|
760
799
|
Examples
|
761
800
|
--------
|
801
|
+
The following example plots the cross power spectral density of two signals with
|
802
|
+
some common features:
|
803
|
+
|
762
804
|
>>> import numpy as np
|
763
805
|
>>> from scipy import signal
|
764
806
|
>>> import matplotlib.pyplot as plt
|
765
807
|
>>> rng = np.random.default_rng()
|
766
|
-
|
767
|
-
Generate two test signals with some common features
|
768
|
-
|
769
|
-
>>>
|
770
|
-
>>> N = 1e5
|
771
|
-
>>> amp = 20
|
772
|
-
>>> freq = 1234.0
|
808
|
+
...
|
809
|
+
... # Generate two test signals with some common features:
|
810
|
+
>>> N, fs = 100_000, 10e3 # number of samples and sampling frequency
|
811
|
+
>>> amp, freq = 20, 1234.0 # amplitude and frequency of utilized sine signal
|
773
812
|
>>> noise_power = 0.001 * fs / 2
|
774
813
|
>>> time = np.arange(N) / fs
|
775
814
|
>>> b, a = signal.butter(2, 0.25, 'low')
|
@@ -777,40 +816,142 @@ def csd(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None,
|
|
777
816
|
>>> y = signal.lfilter(b, a, x)
|
778
817
|
>>> x += amp*np.sin(2*np.pi*freq*time)
|
779
818
|
>>> y += rng.normal(scale=0.1*np.sqrt(noise_power), size=time.shape)
|
819
|
+
...
|
820
|
+
... # Compute and plot the magnitude of the cross spectral density:
|
821
|
+
>>> nperseg, noverlap, win = 1024, 512, 'hann'
|
822
|
+
>>> f, Pxy = signal.csd(x, y, fs, win, nperseg, noverlap)
|
823
|
+
>>> fig0, ax0 = plt.subplots(tight_layout=True)
|
824
|
+
>>> ax0.set_title(f"CSD ({win.title()}-window, {nperseg=}, {noverlap=})")
|
825
|
+
>>> ax0.set(xlabel="Frequency $f$ in kHz", ylabel="CSD Magnitude in V²/Hz")
|
826
|
+
>>> ax0.semilogy(f/1e3, np.abs(Pxy))
|
827
|
+
>>> ax0.grid()
|
828
|
+
>>> plt.show()
|
780
829
|
|
781
|
-
|
830
|
+
The cross spectral density is calculated by taking the average over the time slices
|
831
|
+
of a spectrogram:
|
782
832
|
|
783
|
-
>>>
|
784
|
-
|
785
|
-
|
786
|
-
>>>
|
787
|
-
|
833
|
+
>>> SFT = signal.ShortTimeFFT.from_window('hann', fs, nperseg, noverlap,
|
834
|
+
... scale_to='psd', fft_mode='onesided2X',
|
835
|
+
... phase_shift=None)
|
836
|
+
>>> Sxy1 = SFT.spectrogram(y, x, detr='constant', k_offset=nperseg//2,
|
837
|
+
... p0=0, p1=(N-noverlap) // SFT.hop)
|
838
|
+
>>> Pxy1 = Sxy1.mean(axis=-1)
|
839
|
+
>>> np.allclose(Pxy, Pxy1) # same result as with csd()
|
840
|
+
True
|
788
841
|
|
842
|
+
As discussed in the Notes section, the results of using an approach analogous to
|
843
|
+
the code snippet above and the `csd` function may deviate due to implementation
|
844
|
+
details.
|
845
|
+
|
846
|
+
Note that the code snippet above can be easily adapted to determine other
|
847
|
+
statistical properties than the mean value.
|
789
848
|
"""
|
790
|
-
|
791
|
-
|
792
|
-
|
849
|
+
# The following lines are resembling the behavior of the originally utilized
|
850
|
+
# `_spectral_helper()` function:
|
851
|
+
same_data, axis = y is x, int(axis)
|
852
|
+
x = np.asarray(x)
|
853
|
+
|
854
|
+
if not same_data:
|
855
|
+
y = np.asarray(y)
|
856
|
+
# Check if we can broadcast the outer axes together
|
857
|
+
x_outer, y_outer = list(x.shape), list(y.shape)
|
858
|
+
x_outer.pop(axis)
|
859
|
+
y_outer.pop(axis)
|
860
|
+
try:
|
861
|
+
outer_shape = np.broadcast_shapes(x_outer, y_outer)
|
862
|
+
except ValueError as e:
|
863
|
+
raise ValueError('x and y cannot be broadcast together.') from e
|
864
|
+
if x.size == 0 or y.size == 0:
|
865
|
+
out_shape = outer_shape + (min([x.shape[axis], y.shape[axis]]),)
|
866
|
+
empty_out = np.moveaxis(np.empty(out_shape), -1, axis)
|
867
|
+
return empty_out, empty_out
|
868
|
+
out_dtype = np.result_type(x, y, np.complex64)
|
869
|
+
else: # x is y:
|
870
|
+
if x.size == 0:
|
871
|
+
return np.empty(x.shape), np.empty(x.shape)
|
872
|
+
out_dtype = np.result_type(x, np.complex64)
|
873
|
+
|
874
|
+
n = x.shape[axis] if same_data else max(x.shape[axis], y.shape[axis])
|
875
|
+
if isinstance(window, str) or isinstance(window, tuple):
|
876
|
+
nperseg = int(nperseg) if nperseg is not None else 256
|
877
|
+
if nperseg < 1:
|
878
|
+
raise ValueError(f"Parameter {nperseg=} is not a positive integer!")
|
879
|
+
elif n < nperseg:
|
880
|
+
warnings.warn(f"{nperseg=} is greater than signal length max(len(x), " +
|
881
|
+
f"len(y)) = {n}, using nperseg = {n}", stacklevel=3)
|
882
|
+
nperseg = n
|
883
|
+
win = get_window(window, nperseg)
|
884
|
+
else:
|
885
|
+
win = np.asarray(window)
|
886
|
+
if nperseg is None:
|
887
|
+
nperseg = len(win)
|
888
|
+
if nperseg != len(win):
|
889
|
+
raise ValueError(f"{nperseg=} does not equal {len(win)=}")
|
890
|
+
|
891
|
+
nfft = int(nfft) if nfft is not None else nperseg
|
892
|
+
if nfft < nperseg:
|
893
|
+
raise ValueError(f"{nfft=} must be greater than or equal to {nperseg=}!")
|
894
|
+
noverlap = int(noverlap) if noverlap is not None else nperseg // 2
|
895
|
+
if noverlap >= nperseg:
|
896
|
+
raise ValueError(f"{noverlap=} must be less than {nperseg=}!")
|
897
|
+
if np.iscomplexobj(x) and return_onesided:
|
898
|
+
return_onesided = False
|
899
|
+
|
900
|
+
if x.shape[axis] < y.shape[axis]: # zero-pad x to shape of y:
|
901
|
+
z_shape = list(y.shape)
|
902
|
+
z_shape[axis] = y.shape[axis] - x.shape[axis]
|
903
|
+
x = np.concatenate((x, np.zeros(z_shape)), axis=axis)
|
904
|
+
elif y.shape[axis] < x.shape[axis]: # zero-pad y to shape of x:
|
905
|
+
z_shape = list(x.shape)
|
906
|
+
z_shape[axis] = x.shape[axis] - y.shape[axis]
|
907
|
+
y = np.concatenate((y, np.zeros(z_shape)), axis=axis)
|
908
|
+
|
909
|
+
# using cast() to make mypy happy:
|
910
|
+
fft_mode = cast(FFT_MODE_TYPE, 'onesided' if return_onesided else 'twosided')
|
911
|
+
if scaling not in (scales := {'spectrum': 'magnitude', 'density': 'psd'}):
|
912
|
+
raise ValueError(f"Parameter {scaling=} not in {scales}!")
|
913
|
+
|
914
|
+
SFT = ShortTimeFFT(win, nperseg - noverlap, fs, fft_mode=fft_mode, mfft=nfft,
|
915
|
+
scale_to=scales[scaling], phase_shift=None)
|
916
|
+
# csd() calculates X.conj()*Y instead of X*Y.conj():
|
917
|
+
Pxy = SFT.spectrogram(y, x, detr=None if detrend is False else detrend,
|
918
|
+
p0=0, p1=(n - noverlap) // SFT.hop, k_offset=nperseg // 2,
|
919
|
+
axis=axis)
|
920
|
+
|
921
|
+
# Note:
|
922
|
+
# 'onesided2X' scaling of ShortTimeFFT conflicts with the
|
923
|
+
# scaling='spectrum' parameter, since it doubles the squared magnitude,
|
924
|
+
# which in the view of the ShortTimeFFT implementation does not make sense.
|
925
|
+
# Hence, the doubling of the square is implemented here:
|
926
|
+
if return_onesided:
|
927
|
+
f_axis = Pxy.ndim - 1 + axis if axis < 0 else axis
|
928
|
+
Pxy = np.moveaxis(Pxy, f_axis, -1)
|
929
|
+
Pxy[..., 1:-1 if SFT.mfft % 2 == 0 else None] *= 2
|
930
|
+
Pxy = np.moveaxis(Pxy, -1, f_axis)
|
793
931
|
|
794
932
|
# Average over windows.
|
795
|
-
if
|
796
|
-
if
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
+ 1j * np.median(np.imag(Pxy), axis=-1))
|
803
|
-
else:
|
804
|
-
Pxy = np.median(Pxy, axis=-1)
|
805
|
-
Pxy /= bias
|
806
|
-
elif average == 'mean':
|
807
|
-
Pxy = Pxy.mean(axis=-1)
|
933
|
+
if Pxy.shape[-1] > 1:
|
934
|
+
if average == 'median':
|
935
|
+
# np.median must be passed real arrays for the desired result
|
936
|
+
bias = _median_bias(Pxy.shape[-1])
|
937
|
+
if np.iscomplexobj(Pxy):
|
938
|
+
Pxy = (np.median(np.real(Pxy), axis=-1) +
|
939
|
+
np.median(np.imag(Pxy), axis=-1) * 1j)
|
808
940
|
else:
|
809
|
-
|
941
|
+
Pxy = np.median(Pxy, axis=-1)
|
942
|
+
Pxy /= bias
|
943
|
+
elif average == 'mean':
|
944
|
+
Pxy = Pxy.mean(axis=-1)
|
810
945
|
else:
|
811
|
-
|
946
|
+
raise ValueError(f"Parameter {average=} must be 'median' or 'mean'!")
|
947
|
+
else:
|
948
|
+
Pxy = np.reshape(Pxy, Pxy.shape[:-1])
|
812
949
|
|
813
|
-
|
950
|
+
# cast output type;
|
951
|
+
Pxy = Pxy.astype(out_dtype)
|
952
|
+
if same_data:
|
953
|
+
Pxy = Pxy.real
|
954
|
+
return SFT.f, Pxy
|
814
955
|
|
815
956
|
|
816
957
|
def spectrogram(x, fs=1.0, window=('tukey', .25), nperseg=None, noverlap=None,
|
@@ -997,7 +1138,26 @@ def spectrogram(x, fs=1.0, window=('tukey', .25), nperseg=None, noverlap=None,
|
|
997
1138
|
|
998
1139
|
|
999
1140
|
def check_COLA(window, nperseg, noverlap, tol=1e-10):
|
1000
|
-
r"""Check whether the Constant OverLap Add (COLA) constraint is met
|
1141
|
+
r"""Check whether the Constant OverLap Add (COLA) constraint is met
|
1142
|
+
(legacy function).
|
1143
|
+
|
1144
|
+
.. legacy:: function
|
1145
|
+
|
1146
|
+
The COLA constraint is equivalent of having a constant dual window, i.e.,
|
1147
|
+
``all(ShortTimeFFT.dual_win == ShortTimeFFT.dual_win[0])``. Hence,
|
1148
|
+
`closest_STFT_dual_window` generalizes this function, as the following
|
1149
|
+
example shows:
|
1150
|
+
|
1151
|
+
>>> import numpy as np
|
1152
|
+
>>> from scipy.signal import check_COLA, closest_STFT_dual_window, windows
|
1153
|
+
...
|
1154
|
+
>>> w, w_rect, hop = windows.hann(12, sym=False), np.ones(12), 6
|
1155
|
+
>>> dual_win, alpha = closest_STFT_dual_window(w, hop, w_rect, scaled=True)
|
1156
|
+
>>> np.allclose(dual_win/alpha, w_rect, atol=1e-10, rtol=0)
|
1157
|
+
True
|
1158
|
+
>>> check_COLA(w, len(w), len(w) - hop) # equivalent legacy function call
|
1159
|
+
True
|
1160
|
+
|
1001
1161
|
|
1002
1162
|
Parameters
|
1003
1163
|
----------
|
@@ -1023,17 +1183,22 @@ def check_COLA(window, nperseg, noverlap, tol=1e-10):
|
|
1023
1183
|
|
1024
1184
|
See Also
|
1025
1185
|
--------
|
1186
|
+
closest_STFT_dual_window: Allows determining the closest window meeting the
|
1187
|
+
COLA constraint for a given window
|
1026
1188
|
check_NOLA: Check whether the Nonzero Overlap Add (NOLA) constraint is met
|
1027
|
-
|
1028
|
-
|
1189
|
+
ShortTimeFFT: Provide short-time Fourier transform and its inverse
|
1190
|
+
stft: Short-time Fourier transform (legacy)
|
1191
|
+
istft: Inverse Short-time Fourier transform (legacy)
|
1029
1192
|
|
1030
1193
|
Notes
|
1031
1194
|
-----
|
1032
|
-
In order to
|
1033
|
-
|
1195
|
+
In order to invert a short-time Fourier transfrom (STFT) with the so-called
|
1196
|
+
"overlap-add method", the signal windowing must obey the constraint of
|
1034
1197
|
"Constant OverLap Add" (COLA). This ensures that every point in the input
|
1035
1198
|
data is equally weighted, thereby avoiding aliasing and allowing full
|
1036
|
-
reconstruction.
|
1199
|
+
reconstruction. Note that the algorithms implemented in `ShortTimeFFT.istft`
|
1200
|
+
and in `istft` (legacy) only require that the weaker "nonzero overlap-add"
|
1201
|
+
condition (as in `check_NOLA`) is met.
|
1037
1202
|
|
1038
1203
|
Some examples of windows that satisfy COLA:
|
1039
1204
|
- Rectangular window at overlap of 0, 1/2, 2/3, 3/4, ...
|
@@ -1802,7 +1967,7 @@ def coherence(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None,
|
|
1802
1967
|
-----
|
1803
1968
|
An appropriate amount of overlap will depend on the choice of window
|
1804
1969
|
and on your requirements. For the default Hann window an overlap of
|
1805
|
-
50% is a reasonable trade
|
1970
|
+
50% is a reasonable trade-off between accurately estimating the
|
1806
1971
|
signal power, while not over counting any of the data. Narrower
|
1807
1972
|
windows may require a larger overlap.
|
1808
1973
|
|
@@ -1866,6 +2031,11 @@ def _spectral_helper(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None,
|
|
1866
2031
|
padded=False):
|
1867
2032
|
"""Calculate various forms of windowed FFTs for PSD, CSD, etc.
|
1868
2033
|
|
2034
|
+
.. legacy:: function
|
2035
|
+
|
2036
|
+
This function is soley used by the legacy functions `spectrogram` and `stft`
|
2037
|
+
(which are also in this same source file `scipy/signal/_spectral_py.py`).
|
2038
|
+
|
1869
2039
|
This is a helper function that implements the commonality between
|
1870
2040
|
the stft, psd, csd, and spectrogram functions. It is not designed to
|
1871
2041
|
be called externally. The windows are not averaged over; the result
|
@@ -1910,8 +2080,8 @@ def _spectral_helper(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None,
|
|
1910
2080
|
complex data, a two-sided spectrum is always returned.
|
1911
2081
|
scaling : { 'density', 'spectrum' }, optional
|
1912
2082
|
Selects between computing the cross spectral density ('density')
|
1913
|
-
where `Pxy` has units of V
|
1914
|
-
spectrum ('spectrum') where `Pxy` has units of V
|
2083
|
+
where `Pxy` has units of V²/Hz and computing the cross
|
2084
|
+
spectrum ('spectrum') where `Pxy` has units of V², if `x`
|
1915
2085
|
and `y` are measured in V and `fs` is measured in Hz.
|
1916
2086
|
Defaults to 'density'
|
1917
2087
|
axis : int, optional
|
@@ -2160,6 +2330,11 @@ def _fft_helper(x, win, detrend_func, nperseg, noverlap, nfft, sides):
|
|
2160
2330
|
Calculate windowed FFT, for internal use by
|
2161
2331
|
`scipy.signal._spectral_helper`.
|
2162
2332
|
|
2333
|
+
.. legacy:: function
|
2334
|
+
|
2335
|
+
This function is solely used by the legacy `_spectral_helper` function,
|
2336
|
+
which is located also in this file.
|
2337
|
+
|
2163
2338
|
This is a helper function that does the main FFT calculation for
|
2164
2339
|
`_spectral helper`. All input validation is performed there, and the
|
2165
2340
|
data axis is assumed to be the last axis of x. It is not designed to
|
@@ -2209,6 +2384,11 @@ def _triage_segments(window, nperseg, input_length):
|
|
2209
2384
|
Parses window and nperseg arguments for spectrogram and _spectral_helper.
|
2210
2385
|
This is a helper function, not meant to be called externally.
|
2211
2386
|
|
2387
|
+
.. legacy:: function
|
2388
|
+
|
2389
|
+
This function is soley used by the legacy functions `spectrogram` and
|
2390
|
+
`_spectral_helper` (which are also in this file).
|
2391
|
+
|
2212
2392
|
Parameters
|
2213
2393
|
----------
|
2214
2394
|
window : string, tuple, or ndarray
|
Binary file
|
Binary file
|