scipy 1.15.3__cp312-cp312-macosx_12_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_12_0_arm64.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/.dylibs/libscipy_openblas.dylib +0 -0
- scipy/__config__.py +8 -8
- scipy/__init__.py +3 -6
- scipy/_cyutility.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/_lib/_docscrape.py +1 -1
- scipy/_lib/_elementwise_iterative_method.py +15 -26
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_deprecation_call.cpython-312-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-312-darwin.so +0 -0
- scipy/_lib/_testutils.py +6 -2
- 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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-312-darwin.so +0 -0
- scipy/cluster/_vq.cpython-312-darwin.so +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/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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/integrate/_lsoda.cpython-312-darwin.so +0 -0
- scipy/integrate/_ode.py +9 -2
- scipy/integrate/_odepack.cpython-312-darwin.so +0 -0
- scipy/integrate/_quad_vec.py +21 -29
- scipy/integrate/_quadpack.cpython-312-darwin.so +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_odeint_banded.cpython-312-darwin.so +0 -0
- scipy/integrate/_vode.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-312-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/interpolate/_rbf.py +2 -2
- scipy/interpolate/_rbfinterp.py +1 -1
- scipy/interpolate/_rbfinterp_pythran.cpython-312-darwin.so +0 -0
- scipy/interpolate/_rgi.py +31 -26
- scipy/interpolate/_rgi_cython.cpython-312-darwin.so +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/_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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-312-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +4 -1
- scipy/io/matlab/_streams.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +4 -1
- scipy/linalg/_decomp_lu.py +18 -6
- scipy/linalg/_decomp_lu_cython.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +4 -0
- scipy/linalg/_fblas.cpython-312-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-312-darwin.so +0 -0
- scipy/linalg/_linalg_pythran.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +187 -4
- scipy/linalg/_matfuncs_expm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-312-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +1 -99
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-312-darwin.so +0 -0
- scipy/linalg/_procrustes.py +2 -0
- scipy/linalg/_sketches.py +17 -6
- scipy/linalg/_solve_toeplitz.cpython-312-darwin.so +0 -0
- scipy/linalg/_solvers.py +7 -2
- scipy/linalg/_special_matrices.py +26 -36
- scipy/linalg/cython_blas.cpython-312-darwin.so +0 -0
- scipy/linalg/cython_lapack.cpython-312-darwin.so +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/_cytest.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/ndimage/_ni_docstrings.py +5 -1
- scipy/ndimage/_ni_label.cpython-312-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +1 -5
- scipy/ndimage/_rank_filter_1d.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/optimize/_basinhopping.py +13 -7
- scipy/optimize/_bglu_dense.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/optimize/_dual_annealing.py +1 -1
- scipy/optimize/_elementwise.py +1 -4
- scipy/optimize/_group_columns.cpython-312-darwin.so +0 -0
- scipy/optimize/_lbfgsb.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/optimize/_lsq/common.py +3 -3
- scipy/optimize/_lsq/dogbox.py +16 -2
- scipy/optimize/_lsq/givens_elimination.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +21 -14
- scipy/optimize/_moduleTNC.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/optimize/_spectral.py +1 -1
- scipy/optimize/_tnc.py +8 -1
- scipy/optimize/_trlib/_trlib.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +97 -17
- scipy/optimize/cython_optimize/_zeros.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/signal/_peak_finding_utils.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-312-darwin.so +0 -0
- scipy/signal/_spectral_py.py +230 -50
- scipy/signal/_spline.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_matching.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-312-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-312-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-312-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-312-darwin.so +0 -0
- scipy/spatial/_hausdorff.cpython-312-darwin.so +0 -0
- scipy/spatial/_qhull.cpython-312-darwin.so +0 -0
- scipy/spatial/_voronoi.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/special/_ellip_harm_2.cpython-312-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_logsumexp.py +67 -58
- scipy/special/_orthogonal.pyi +1 -1
- scipy/special/_specfun.cpython-312-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_spherical_bessel.py +4 -4
- scipy/special/_support_alternative_backends.py +212 -119
- scipy/special/_test_internal.cpython-312-darwin.so +0 -0
- scipy/special/_testutils.py +4 -4
- scipy/special/_ufuncs.cpython-312-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +1 -0
- scipy/special/_ufuncs.pyx +215 -1400
- scipy/special/_ufuncs_cxx.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +5 -12
- scipy/stats/_biasedurn.cpython-312-darwin.so +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.cpython-312-darwin.so +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.cpython-312-darwin.so +0 -0
- scipy/stats/_qmvnt.py +16 -95
- scipy/stats/_qmvnt_cy.cpython-312-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/rcont.cpython-312-darwin.so +0 -0
- scipy/stats/_resampling.py +4 -29
- scipy/stats/_sampling.py +1 -1
- scipy/stats/_sobol.cpython-312-darwin.so +0 -0
- scipy/stats/_stats.cpython-312-darwin.so +0 -0
- scipy/stats/_stats_mstats_common.py +21 -2
- scipy/stats/_stats_py.py +550 -476
- scipy/stats/_stats_pythran.cpython-312-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-312-darwin.so +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.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 +561 -568
- scipy-1.16.0rc2.dist-info/WHEEL +6 -0
- scipy/_lib/array_api_extra/_funcs.py +0 -484
- scipy/_lib/array_api_extra/_typing.py +0 -8
- scipy/interpolate/_bspl.cpython-312-darwin.so +0 -0
- scipy/optimize/_cobyla.cpython-312-darwin.so +0 -0
- scipy/optimize/_cython_nnls.cpython-312-darwin.so +0 -0
- scipy/optimize/_slsqp.cpython-312-darwin.so +0 -0
- scipy/spatial/qhull_src/COPYING.txt +0 -38
- scipy/special/libsf_error_state.dylib +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.cpython-312-darwin.so +0 -0
- scipy-1.15.3.dist-info/WHEEL +0 -4
scipy/signal/_spline_filters.py
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
import math
|
2
|
+
|
3
|
+
from numpy import (zeros_like, array, tan, arange, floor,
|
4
|
+
r_, atleast_1d, greater, cos, add, sin,
|
5
|
+
moveaxis, abs, complex64, float32)
|
5
6
|
import numpy as np
|
6
7
|
|
8
|
+
from scipy._lib._array_api import array_namespace, xp_promote
|
9
|
+
|
7
10
|
from scipy._lib._util import normalize_axis_index
|
8
11
|
|
9
12
|
# From splinemodule.c
|
@@ -57,6 +60,9 @@ def spline_filter(Iin, lmbda=5.0):
|
|
57
60
|
>>> plt.show()
|
58
61
|
|
59
62
|
"""
|
63
|
+
xp = array_namespace(Iin)
|
64
|
+
Iin = np.asarray(Iin)
|
65
|
+
|
60
66
|
if Iin.dtype not in [np.float32, np.float64, np.complex64, np.complex128]:
|
61
67
|
raise TypeError(f"Invalid data type for Iin: {Iin.dtype = }")
|
62
68
|
|
@@ -73,7 +79,7 @@ def spline_filter(Iin, lmbda=5.0):
|
|
73
79
|
ck = cspline2d(Iin, lmbda)
|
74
80
|
out = sepfir2d(ck, hcol, hcol)
|
75
81
|
out = out.astype(intype)
|
76
|
-
return out
|
82
|
+
return xp.asarray(out)
|
77
83
|
|
78
84
|
|
79
85
|
_splinefunc_cache = {}
|
@@ -124,32 +130,37 @@ def gauss_spline(x, n):
|
|
124
130
|
array([0.15418033, 0.6909883, 0.15418033]) # may vary
|
125
131
|
|
126
132
|
"""
|
127
|
-
|
133
|
+
xp = array_namespace(x)
|
134
|
+
x = xp.asarray(x)
|
128
135
|
signsq = (n + 1) / 12.0
|
129
|
-
return 1 / sqrt(2 * pi * signsq) * exp(-x ** 2 / 2 / signsq)
|
136
|
+
return 1 / math.sqrt(2 * math.pi * signsq) * xp.exp(-x ** 2 / 2 / signsq)
|
130
137
|
|
131
138
|
|
132
139
|
def _cubic(x):
|
133
|
-
|
140
|
+
xp = array_namespace(x)
|
141
|
+
|
142
|
+
x = np.asarray(x, dtype=float)
|
134
143
|
b = BSpline.basis_element([-2, -1, 0, 1, 2], extrapolate=False)
|
135
144
|
out = b(x)
|
136
145
|
out[(x < -2) | (x > 2)] = 0
|
137
|
-
return out
|
146
|
+
return xp.asarray(out)
|
138
147
|
|
139
148
|
|
140
149
|
def _quadratic(x):
|
141
|
-
|
150
|
+
xp = array_namespace(x)
|
151
|
+
|
152
|
+
x = abs(np.asarray(x, dtype=float))
|
142
153
|
b = BSpline.basis_element([-1.5, -0.5, 0.5, 1.5], extrapolate=False)
|
143
154
|
out = b(x)
|
144
155
|
out[(x < -1.5) | (x > 1.5)] = 0
|
145
|
-
return out
|
156
|
+
return xp.asarray(out)
|
146
157
|
|
147
158
|
|
148
159
|
def _coeff_smooth(lam):
|
149
|
-
xi = 1 - 96 * lam + 24 * lam * sqrt(3 + 144 * lam)
|
150
|
-
omeg =
|
151
|
-
rho = (24 * lam - 1 - sqrt(xi)) / (24 * lam)
|
152
|
-
rho = rho * sqrt((48 * lam + 24 * lam * sqrt(3 + 144 * lam)) / xi)
|
160
|
+
xi = 1 - 96 * lam + 24 * lam * math.sqrt(3 + 144 * lam)
|
161
|
+
omeg = math.atan2(math.sqrt(144 * lam - 1), math.sqrt(xi))
|
162
|
+
rho = (24 * lam - 1 - math.sqrt(xi)) / (24 * lam)
|
163
|
+
rho = rho * math.sqrt((48 * lam + 24 * lam * math.sqrt(3 + 144 * lam)) / xi)
|
153
164
|
return rho, omeg
|
154
165
|
|
155
166
|
|
@@ -167,6 +178,8 @@ def _hs(k, cs, rho, omega):
|
|
167
178
|
|
168
179
|
|
169
180
|
def _cubic_smooth_coeff(signal, lamb):
|
181
|
+
signal = np.asarray(signal)
|
182
|
+
|
170
183
|
rho, omega = _coeff_smooth(lamb)
|
171
184
|
cs = 1 - 2 * rho * cos(omega) + rho * rho
|
172
185
|
K = len(signal)
|
@@ -209,9 +222,11 @@ def _cubic_smooth_coeff(signal, lamb):
|
|
209
222
|
|
210
223
|
|
211
224
|
def _cubic_coeff(signal):
|
212
|
-
|
225
|
+
signal = np.asarray(signal)
|
226
|
+
|
227
|
+
zi = -2 + math.sqrt(3)
|
213
228
|
K = len(signal)
|
214
|
-
powers = zi ** arange(K)
|
229
|
+
powers = zi ** np.arange(K)
|
215
230
|
|
216
231
|
if K == 1:
|
217
232
|
yplus = signal[0] + zi * add.reduce(powers * signal)
|
@@ -223,10 +238,10 @@ def _cubic_coeff(signal):
|
|
223
238
|
# for k in range(1, K):
|
224
239
|
# yplus[k] = signal[k] + zi * yplus[k - 1]
|
225
240
|
|
226
|
-
state = lfiltic(1, r_[1, -zi], atleast_1d(add.reduce(powers * signal)))
|
241
|
+
state = lfiltic(1, np.r_[1, -zi], np.atleast_1d(add.reduce(powers * signal)))
|
227
242
|
|
228
|
-
b = ones(1)
|
229
|
-
a = r_[1, -zi]
|
243
|
+
b = np.ones(1)
|
244
|
+
a = np.r_[1, -zi]
|
230
245
|
yplus, _ = lfilter(b, a, signal, zi=state)
|
231
246
|
|
232
247
|
# Reverse filter:
|
@@ -234,21 +249,23 @@ def _cubic_coeff(signal):
|
|
234
249
|
# for k in range(K - 2, -1, -1):
|
235
250
|
# output[k] = zi * (output[k + 1] - yplus[k])
|
236
251
|
out_last = zi / (zi - 1) * yplus[K - 1]
|
237
|
-
state = lfiltic(-zi, r_[1, -zi], atleast_1d(out_last))
|
252
|
+
state = lfiltic(-zi, r_[1, -zi], np.atleast_1d(out_last))
|
238
253
|
|
239
|
-
b = asarray([-zi])
|
254
|
+
b = np.asarray([-zi])
|
240
255
|
output, _ = lfilter(b, a, yplus[-2::-1], zi=state)
|
241
|
-
output = r_[output[::-1], out_last]
|
256
|
+
output = np.r_[output[::-1], out_last]
|
242
257
|
return output * 6.0
|
243
258
|
|
244
259
|
|
245
260
|
def _quadratic_coeff(signal):
|
246
|
-
|
261
|
+
signal = np.asarray(signal)
|
262
|
+
|
263
|
+
zi = -3 + 2 * math.sqrt(2.0)
|
247
264
|
K = len(signal)
|
248
|
-
powers = zi ** arange(K)
|
265
|
+
powers = zi ** np.arange(K)
|
249
266
|
|
250
267
|
if K == 1:
|
251
|
-
yplus = signal[0] + zi * add.reduce(powers * signal)
|
268
|
+
yplus = signal[0] + zi * np.add.reduce(powers * signal)
|
252
269
|
output = zi / (zi - 1) * yplus
|
253
270
|
return atleast_1d(output)
|
254
271
|
|
@@ -257,10 +274,10 @@ def _quadratic_coeff(signal):
|
|
257
274
|
# for k in range(1, K):
|
258
275
|
# yplus[k] = signal[k] + zi * yplus[k - 1]
|
259
276
|
|
260
|
-
state = lfiltic(1, r_[1, -zi], atleast_1d(add.reduce(powers * signal)))
|
277
|
+
state = lfiltic(1, np.r_[1, -zi], np.atleast_1d(np.add.reduce(powers * signal)))
|
261
278
|
|
262
|
-
b = ones(1)
|
263
|
-
a = r_[1, -zi]
|
279
|
+
b = np.ones(1)
|
280
|
+
a = np.r_[1, -zi]
|
264
281
|
yplus, _ = lfilter(b, a, signal, zi=state)
|
265
282
|
|
266
283
|
# Reverse filter:
|
@@ -268,21 +285,21 @@ def _quadratic_coeff(signal):
|
|
268
285
|
# for k in range(K - 2, -1, -1):
|
269
286
|
# output[k] = zi * (output[k + 1] - yplus[k])
|
270
287
|
out_last = zi / (zi - 1) * yplus[K - 1]
|
271
|
-
state = lfiltic(-zi, r_[1, -zi], atleast_1d(out_last))
|
288
|
+
state = lfiltic(-zi, r_[1, -zi], np.atleast_1d(out_last))
|
272
289
|
|
273
|
-
b = asarray([-zi])
|
290
|
+
b = np.asarray([-zi])
|
274
291
|
output, _ = lfilter(b, a, yplus[-2::-1], zi=state)
|
275
|
-
output = r_[output[::-1], out_last]
|
292
|
+
output = np.r_[output[::-1], out_last]
|
276
293
|
return output * 8.0
|
277
294
|
|
278
295
|
|
279
296
|
def compute_root_from_lambda(lamb):
|
280
|
-
tmp = sqrt(3 + 144 * lamb)
|
297
|
+
tmp = math.sqrt(3 + 144 * lamb)
|
281
298
|
xi = 1 - 96 * lamb + 24 * lamb * tmp
|
282
|
-
omega =
|
283
|
-
tmp2 = sqrt(xi)
|
299
|
+
omega = math.atan(math.sqrt((144 * lamb - 1.0) / xi))
|
300
|
+
tmp2 = math.sqrt(xi)
|
284
301
|
r = ((24 * lamb - 1 - tmp2) / (24 * lamb) *
|
285
|
-
sqrt(48*lamb + 24 * lamb * tmp) / tmp2)
|
302
|
+
math.sqrt(48*lamb + 24 * lamb * tmp) / tmp2)
|
286
303
|
return r, omega
|
287
304
|
|
288
305
|
|
@@ -330,10 +347,13 @@ def cspline1d(signal, lamb=0.0):
|
|
330
347
|
>>> plt.show()
|
331
348
|
|
332
349
|
"""
|
350
|
+
xp = array_namespace(signal)
|
351
|
+
|
333
352
|
if lamb != 0.0:
|
334
|
-
|
353
|
+
ret = _cubic_smooth_coeff(signal, lamb)
|
335
354
|
else:
|
336
|
-
|
355
|
+
ret = _cubic_coeff(signal)
|
356
|
+
return xp.asarray(ret)
|
337
357
|
|
338
358
|
|
339
359
|
def qspline1d(signal, lamb=0.0):
|
@@ -381,10 +401,12 @@ def qspline1d(signal, lamb=0.0):
|
|
381
401
|
>>> plt.show()
|
382
402
|
|
383
403
|
"""
|
404
|
+
xp = array_namespace(signal)
|
405
|
+
|
384
406
|
if lamb != 0.0:
|
385
407
|
raise ValueError("Smoothing quadratic splines not supported yet.")
|
386
408
|
else:
|
387
|
-
return _quadratic_coeff(signal)
|
409
|
+
return xp.asarray(_quadratic_coeff(signal))
|
388
410
|
|
389
411
|
|
390
412
|
def collapse_2d(x, axis):
|
@@ -445,7 +467,7 @@ def qspline2d(signal, lamb=0.0, precision=-1.0):
|
|
445
467
|
raise ValueError('lambda must be negative or zero')
|
446
468
|
|
447
469
|
# normal quadratic spline
|
448
|
-
r = -3 + 2 * sqrt(2.0)
|
470
|
+
r = -3 + 2 * math.sqrt(2.0)
|
449
471
|
c0 = -r * 8.0
|
450
472
|
z1 = r
|
451
473
|
|
@@ -476,15 +498,18 @@ def cspline2d(signal, lamb=0.0, precision=-1.0):
|
|
476
498
|
output : ndarray
|
477
499
|
The filtered signal.
|
478
500
|
"""
|
501
|
+
xp = array_namespace(signal)
|
502
|
+
signal = np.asarray(signal)
|
503
|
+
|
479
504
|
if precision < 0.0 or precision >= 1.0:
|
480
|
-
if signal.dtype in [float32, complex64]:
|
505
|
+
if signal.dtype in [np.float32, np.complex64]:
|
481
506
|
precision = 1e-3
|
482
507
|
else:
|
483
508
|
precision = 1e-6
|
484
509
|
|
485
510
|
if lamb <= 1 / 144.0:
|
486
511
|
# Normal cubic spline
|
487
|
-
r = -2 + sqrt(3.0)
|
512
|
+
r = -2 + math.sqrt(3.0)
|
488
513
|
out = symiirorder_nd(
|
489
514
|
symiirorder1, signal, -r * 6.0, r, precision=precision, axis=-1)
|
490
515
|
out = symiirorder_nd(
|
@@ -496,7 +521,7 @@ def cspline2d(signal, lamb=0.0, precision=-1.0):
|
|
496
521
|
precision=precision, axis=-1)
|
497
522
|
out = symiirorder_nd(symiirorder2, out, r, omega,
|
498
523
|
precision=precision, axis=0)
|
499
|
-
return out
|
524
|
+
return xp.asarray(out)
|
500
525
|
|
501
526
|
|
502
527
|
def cspline1d_eval(cj, newx, dx=1.0, x0=0):
|
@@ -549,10 +574,17 @@ def cspline1d_eval(cj, newx, dx=1.0, x0=0):
|
|
549
574
|
>>> plt.show()
|
550
575
|
|
551
576
|
"""
|
552
|
-
|
577
|
+
xp = array_namespace(cj, newx)
|
578
|
+
|
579
|
+
newx = (np.asarray(newx) - x0) / float(dx)
|
580
|
+
cj = np.asarray(cj)
|
581
|
+
|
582
|
+
if cj.size == 0:
|
583
|
+
raise ValueError("Spline coefficients 'cj' must not be empty.")
|
584
|
+
|
553
585
|
res = zeros_like(newx, dtype=cj.dtype)
|
554
586
|
if res.size == 0:
|
555
|
-
return res
|
587
|
+
return xp.asarray(res)
|
556
588
|
N = len(cj)
|
557
589
|
cond1 = newx < 0
|
558
590
|
cond2 = newx > (N - 1)
|
@@ -562,7 +594,7 @@ def cspline1d_eval(cj, newx, dx=1.0, x0=0):
|
|
562
594
|
res[cond2] = cspline1d_eval(cj, 2 * (N - 1) - newx[cond2])
|
563
595
|
newx = newx[cond3]
|
564
596
|
if newx.size == 0:
|
565
|
-
return res
|
597
|
+
return xp.asarray(res)
|
566
598
|
result = zeros_like(newx, dtype=cj.dtype)
|
567
599
|
jlower = floor(newx - 2).astype(int) + 1
|
568
600
|
for i in range(4):
|
@@ -570,7 +602,7 @@ def cspline1d_eval(cj, newx, dx=1.0, x0=0):
|
|
570
602
|
indj = thisj.clip(0, N - 1) # handle edge cases
|
571
603
|
result += cj[indj] * _cubic(newx - thisj)
|
572
604
|
res[cond3] = result
|
573
|
-
return res
|
605
|
+
return xp.asarray(res)
|
574
606
|
|
575
607
|
|
576
608
|
def qspline1d_eval(cj, newx, dx=1.0, x0=0):
|
@@ -625,10 +657,17 @@ def qspline1d_eval(cj, newx, dx=1.0, x0=0):
|
|
625
657
|
>>> plt.show()
|
626
658
|
|
627
659
|
"""
|
628
|
-
|
629
|
-
|
660
|
+
xp = array_namespace(newx, cj)
|
661
|
+
|
662
|
+
newx = (np.asarray(newx) - x0) / dx
|
663
|
+
res = np.zeros_like(newx)
|
630
664
|
if res.size == 0:
|
631
|
-
return res
|
665
|
+
return xp.asarray(res)
|
666
|
+
|
667
|
+
cj = np.asarray(cj)
|
668
|
+
if cj.size == 0:
|
669
|
+
raise ValueError("Spline coefficients 'cj' must not be empty.")
|
670
|
+
|
632
671
|
N = len(cj)
|
633
672
|
cond1 = newx < 0
|
634
673
|
cond2 = newx > (N - 1)
|
@@ -638,7 +677,7 @@ def qspline1d_eval(cj, newx, dx=1.0, x0=0):
|
|
638
677
|
res[cond2] = qspline1d_eval(cj, 2 * (N - 1) - newx[cond2])
|
639
678
|
newx = newx[cond3]
|
640
679
|
if newx.size == 0:
|
641
|
-
return res
|
680
|
+
return xp.asarray(res)
|
642
681
|
result = zeros_like(newx)
|
643
682
|
jlower = floor(newx - 1.5).astype(int) + 1
|
644
683
|
for i in range(3):
|
@@ -646,7 +685,7 @@ def qspline1d_eval(cj, newx, dx=1.0, x0=0):
|
|
646
685
|
indj = thisj.clip(0, N - 1) # handle edge cases
|
647
686
|
result += cj[indj] * _quadratic(newx - thisj)
|
648
687
|
res[cond3] = result
|
649
|
-
return res
|
688
|
+
return xp.asarray(res)
|
650
689
|
|
651
690
|
|
652
691
|
def symiirorder1(signal, c0, z1, precision=-1.0):
|
@@ -680,7 +719,12 @@ def symiirorder1(signal, c0, z1, precision=-1.0):
|
|
680
719
|
output : ndarray
|
681
720
|
The filtered signal.
|
682
721
|
"""
|
683
|
-
|
722
|
+
xp = array_namespace(signal)
|
723
|
+
signal = xp_promote(signal, force_floating=True, xp=xp)
|
724
|
+
# This function uses C internals
|
725
|
+
signal = np.asarray(signal)
|
726
|
+
|
727
|
+
if abs(z1) >= 1:
|
684
728
|
raise ValueError('|z1| must be less than 1.0')
|
685
729
|
|
686
730
|
if signal.ndim > 2:
|
@@ -691,9 +735,6 @@ def symiirorder1(signal, c0, z1, precision=-1.0):
|
|
691
735
|
signal = signal[None, :]
|
692
736
|
squeeze_dim = True
|
693
737
|
|
694
|
-
if np.issubdtype(signal.dtype, np.integer):
|
695
|
-
signal = signal.astype(np.promote_types(signal.dtype, np.float32))
|
696
|
-
|
697
738
|
y0 = symiirorder1_ic(signal, z1, precision)
|
698
739
|
|
699
740
|
# Apply first the system 1 / (1 - z1 * z^-1)
|
@@ -722,7 +763,7 @@ def symiirorder1(signal, c0, z1, precision=-1.0):
|
|
722
763
|
if squeeze_dim:
|
723
764
|
out = out[0]
|
724
765
|
|
725
|
-
return out
|
766
|
+
return xp.asarray(out)
|
726
767
|
|
727
768
|
|
728
769
|
def symiirorder2(input, r, omega, precision=-1.0):
|
@@ -758,28 +799,27 @@ def symiirorder2(input, r, omega, precision=-1.0):
|
|
758
799
|
output : ndarray
|
759
800
|
The filtered signal.
|
760
801
|
"""
|
802
|
+
xp = array_namespace(input)
|
803
|
+
input = xp_promote(input, force_floating=True, xp=xp)
|
804
|
+
# This function uses C internals
|
805
|
+
input = np.ascontiguousarray(input)
|
806
|
+
|
761
807
|
if r >= 1.0:
|
762
808
|
raise ValueError('r must be less than 1.0')
|
763
809
|
|
764
810
|
if input.ndim > 2:
|
765
811
|
raise ValueError('Input must be 1D or 2D')
|
766
812
|
|
767
|
-
if not input.flags.c_contiguous:
|
768
|
-
input = input.copy()
|
769
|
-
|
770
813
|
squeeze_dim = False
|
771
814
|
if input.ndim == 1:
|
772
815
|
input = input[None, :]
|
773
816
|
squeeze_dim = True
|
774
817
|
|
775
|
-
if np.issubdtype(input.dtype, np.integer):
|
776
|
-
input = input.astype(np.promote_types(input.dtype, np.float32))
|
777
|
-
|
778
818
|
rsq = r * r
|
779
|
-
a2 = 2 * r *
|
819
|
+
a2 = 2 * r * math.cos(omega)
|
780
820
|
a3 = -rsq
|
781
|
-
cs =
|
782
|
-
sos = np.
|
821
|
+
cs = 1 - 2 * r * math.cos(omega) + rsq
|
822
|
+
sos = np.asarray([cs, 0, 0, 1, -a2, -a3], dtype=input.dtype)
|
783
823
|
|
784
824
|
# Find the starting (forward) conditions.
|
785
825
|
ic_fwd = symiirorder2_ic_fwd(input, r, omega, precision)
|
@@ -787,7 +827,7 @@ def symiirorder2(input, r, omega, precision=-1.0):
|
|
787
827
|
# Apply first the system cs / (1 - a2 * z^-1 - a3 * z^-2)
|
788
828
|
# Compute the initial conditions in the form expected by sosfilt
|
789
829
|
# coef = np.asarray([[a3, a2], [0, a3]], dtype=input.dtype)
|
790
|
-
coef = np.
|
830
|
+
coef = np.asarray([[a3, a2], [0, a3]], dtype=input.dtype)
|
791
831
|
zi = np.matmul(coef, ic_fwd[:, :, None])[:, :, 0]
|
792
832
|
|
793
833
|
y_fwd, _ = sosfilt(sos, axis_slice(input, 2), zi=zi[None])
|
@@ -805,4 +845,4 @@ def symiirorder2(input, r, omega, precision=-1.0):
|
|
805
845
|
if squeeze_dim:
|
806
846
|
out = out[0]
|
807
847
|
|
808
|
-
return out
|
848
|
+
return xp.asarray(out)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
import functools
|
2
|
+
from scipy._lib._array_api import (
|
3
|
+
is_cupy, is_jax, scipy_namespace_for, SCIPY_ARRAY_API
|
4
|
+
)
|
5
|
+
|
6
|
+
from ._signal_api import * # noqa: F403
|
7
|
+
from . import _signal_api
|
8
|
+
from . import _delegators
|
9
|
+
__all__ = _signal_api.__all__
|
10
|
+
|
11
|
+
|
12
|
+
MODULE_NAME = 'signal'
|
13
|
+
|
14
|
+
# jax.scipy.signal has only partial coverage of scipy.signal, so we keep the list
|
15
|
+
# of functions we can delegate to JAX
|
16
|
+
# https://jax.readthedocs.io/en/latest/jax.scipy.html
|
17
|
+
JAX_SIGNAL_FUNCS = [
|
18
|
+
'fftconvolve', 'convolve', 'convolve2d', 'correlate', 'correlate2d',
|
19
|
+
'csd', 'detrend', 'istft', 'welch'
|
20
|
+
]
|
21
|
+
|
22
|
+
# some cupyx.scipy.signal functions are incompatible with their scipy counterparts
|
23
|
+
CUPY_BLACKLIST = ['lfilter_zi', 'sosfilt_zi', 'get_window', 'envelope', 'remez']
|
24
|
+
|
25
|
+
# freqz_sos is a sosfreqz rename, and cupy does not have the new name yet (in v13.x)
|
26
|
+
CUPY_RENAMES = {'freqz_sos': 'sosfreqz'}
|
27
|
+
|
28
|
+
|
29
|
+
def delegate_xp(delegator, module_name):
|
30
|
+
def inner(func):
|
31
|
+
@functools.wraps(func)
|
32
|
+
def wrapper(*args, **kwds):
|
33
|
+
try:
|
34
|
+
xp = delegator(*args, **kwds)
|
35
|
+
except TypeError:
|
36
|
+
# object arrays
|
37
|
+
import numpy as np
|
38
|
+
xp = np
|
39
|
+
|
40
|
+
# try delegating to a cupyx/jax namesake
|
41
|
+
if is_cupy(xp) and func.__name__ not in CUPY_BLACKLIST:
|
42
|
+
func_name = CUPY_RENAMES.get(func.__name__, func.__name__)
|
43
|
+
|
44
|
+
# https://github.com/cupy/cupy/issues/8336
|
45
|
+
import importlib
|
46
|
+
cupyx_module = importlib.import_module(f"cupyx.scipy.{module_name}")
|
47
|
+
cupyx_func = getattr(cupyx_module, func_name)
|
48
|
+
return cupyx_func(*args, **kwds)
|
49
|
+
elif is_jax(xp) and func.__name__ in JAX_SIGNAL_FUNCS:
|
50
|
+
spx = scipy_namespace_for(xp)
|
51
|
+
jax_module = getattr(spx, module_name)
|
52
|
+
jax_func = getattr(jax_module, func.__name__)
|
53
|
+
return jax_func(*args, **kwds)
|
54
|
+
else:
|
55
|
+
# the original function
|
56
|
+
return func(*args, **kwds)
|
57
|
+
return wrapper
|
58
|
+
return inner
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
# ### decorate ###
|
63
|
+
for obj_name in _signal_api.__all__:
|
64
|
+
bare_obj = getattr(_signal_api, obj_name)
|
65
|
+
delegator = getattr(_delegators, obj_name + "_signature", None)
|
66
|
+
|
67
|
+
if SCIPY_ARRAY_API and delegator is not None:
|
68
|
+
f = delegate_xp(delegator, MODULE_NAME)(bare_obj)
|
69
|
+
else:
|
70
|
+
f = bare_obj
|
71
|
+
|
72
|
+
# add the decorated function to the namespace, to be imported in __init__.py
|
73
|
+
vars()[obj_name] = f
|
scipy/signal/_upfirdn.py
CHANGED
@@ -33,6 +33,7 @@
|
|
33
33
|
|
34
34
|
import numpy as np
|
35
35
|
|
36
|
+
from scipy._lib._array_api import array_namespace
|
36
37
|
from ._upfirdn_apply import _output_len, _apply, mode_enum
|
37
38
|
|
38
39
|
__all__ = ['upfirdn', '_output_len']
|
@@ -210,7 +211,9 @@ def upfirdn(h, x, up=1, down=1, axis=-1, mode='constant', cval=0):
|
|
210
211
|
[ 6., 7.],
|
211
212
|
[ 6., 7.]])
|
212
213
|
"""
|
214
|
+
xp = array_namespace(h, x)
|
215
|
+
|
213
216
|
x = np.asarray(x)
|
214
217
|
ufd = _UpFIRDn(h, x.dtype, up, down)
|
215
218
|
# This is equivalent to (but faster than) using np.apply_along_axis
|
216
|
-
return ufd.apply_filter(x, axis, mode, cval)
|
219
|
+
return xp.asarray(ufd.apply_filter(x, axis, mode, cval))
|
Binary file
|
scipy/signal/_waveforms.py
CHANGED
@@ -55,11 +55,7 @@ def sawtooth(t, width=1):
|
|
55
55
|
t, w = asarray(t), asarray(width)
|
56
56
|
w = asarray(w + (t - t))
|
57
57
|
t = asarray(t + (w - w))
|
58
|
-
|
59
|
-
ytype = t.dtype.char
|
60
|
-
else:
|
61
|
-
ytype = 'd'
|
62
|
-
y = zeros(t.shape, ytype)
|
58
|
+
y = zeros(t.shape, dtype="d")
|
63
59
|
|
64
60
|
# width must be between 0 and 1 inclusive
|
65
61
|
mask1 = (w > 1) | (w < 0)
|
@@ -137,12 +133,7 @@ def square(t, duty=0.5):
|
|
137
133
|
t, w = asarray(t), asarray(duty)
|
138
134
|
w = asarray(w + (t - t))
|
139
135
|
t = asarray(t + (w - w))
|
140
|
-
|
141
|
-
ytype = t.dtype.char
|
142
|
-
else:
|
143
|
-
ytype = 'd'
|
144
|
-
|
145
|
-
y = zeros(t.shape, ytype)
|
136
|
+
y = zeros(t.shape, dtype="d")
|
146
137
|
|
147
138
|
# width must be between 0 and 1 inclusive
|
148
139
|
mask1 = (w > 1) | (w < 0)
|
scipy/signal/_wavelets.py
CHANGED
scipy/signal/spline.py
CHANGED
@@ -2,9 +2,8 @@
|
|
2
2
|
# versions of SciPy. Use the `scipy.signal` namespace for importing the
|
3
3
|
# functions included below.
|
4
4
|
|
5
|
-
import
|
5
|
+
from scipy._lib.deprecation import _sub_module_deprecation
|
6
6
|
|
7
|
-
from . import _spline
|
8
7
|
|
9
8
|
__all__ = ['sepfir2d'] # noqa: F822
|
10
9
|
|
@@ -14,12 +13,6 @@ def __dir__():
|
|
14
13
|
|
15
14
|
|
16
15
|
def __getattr__(name):
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
"Try looking in scipy.signal instead.")
|
21
|
-
|
22
|
-
warnings.warn(f"Please use `{name}` from the `scipy.signal` namespace, "
|
23
|
-
"the `scipy.signal.spline` namespace is deprecated.",
|
24
|
-
category=DeprecationWarning, stacklevel=2)
|
25
|
-
return getattr(_spline, name)
|
16
|
+
return _sub_module_deprecation(sub_package="signal", module="spline",
|
17
|
+
private_modules=["_spline"], all=__all__,
|
18
|
+
attribute=name)
|