scipy 1.15.3__cp312-cp312-macosx_14_0_arm64.whl → 1.16.0rc2__cp312-cp312-macosx_14_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/__config__.py +4 -4
- 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 +560 -567
- 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/stats/_morestats.py
CHANGED
@@ -15,15 +15,15 @@ from scipy._lib._util import _rename_parameter, _contains_nan, _get_nan
|
|
15
15
|
from scipy._lib._array_api import (
|
16
16
|
array_namespace,
|
17
17
|
xp_size,
|
18
|
-
xp_moveaxis_to_end,
|
19
18
|
xp_vector_norm,
|
19
|
+
xp_promote,
|
20
20
|
)
|
21
21
|
|
22
22
|
from ._ansari_swilk_statistics import gscale, swilk
|
23
23
|
from . import _stats_py, _wilcoxon
|
24
24
|
from ._fit import FitResult
|
25
25
|
from ._stats_py import (find_repeats, _get_pvalue, SignificanceResult, # noqa:F401
|
26
|
-
_SimpleNormal, _SimpleChi2)
|
26
|
+
_SimpleNormal, _SimpleChi2, _length_nonmasked)
|
27
27
|
from .contingency import chi2_contingency
|
28
28
|
from . import distributions
|
29
29
|
from ._distn_infrastructure import rv_generic
|
@@ -222,7 +222,7 @@ def mvsdist(data):
|
|
222
222
|
|
223
223
|
|
224
224
|
@_axis_nan_policy_factory(
|
225
|
-
lambda x: x, result_to_tuple=lambda x: (x,), n_outputs=1, default_axis=None
|
225
|
+
lambda x: x, result_to_tuple=lambda x, _: (x,), n_outputs=1, default_axis=None
|
226
226
|
)
|
227
227
|
def kstat(data, n=2, *, axis=None):
|
228
228
|
r"""
|
@@ -309,7 +309,7 @@ def kstat(data, n=2, *, axis=None):
|
|
309
309
|
data = xp.reshape(data, (-1,))
|
310
310
|
axis = 0
|
311
311
|
|
312
|
-
N = data
|
312
|
+
N = _length_nonmasked(data, axis, xp=xp)
|
313
313
|
|
314
314
|
S = [None] + [xp.sum(data**k, axis=axis) for k in range(1, n + 1)]
|
315
315
|
if n == 1:
|
@@ -327,7 +327,7 @@ def kstat(data, n=2, *, axis=None):
|
|
327
327
|
|
328
328
|
|
329
329
|
@_axis_nan_policy_factory(
|
330
|
-
lambda x: x, result_to_tuple=lambda x: (x,), n_outputs=1, default_axis=None
|
330
|
+
lambda x: x, result_to_tuple=lambda x, _: (x,), n_outputs=1, default_axis=None
|
331
331
|
)
|
332
332
|
def kstatvar(data, n=2, *, axis=None):
|
333
333
|
r"""Return an unbiased estimator of the variance of the k-statistic.
|
@@ -375,7 +375,7 @@ def kstatvar(data, n=2, *, axis=None):
|
|
375
375
|
if axis is None:
|
376
376
|
data = xp.reshape(data, (-1,))
|
377
377
|
axis = 0
|
378
|
-
N = data
|
378
|
+
N = _length_nonmasked(data, axis, xp=xp)
|
379
379
|
|
380
380
|
if n == 1:
|
381
381
|
return kstat(data, n=2, axis=axis, _no_deco=True) * 1.0/N
|
@@ -854,26 +854,24 @@ def ppcc_plot(x, a, b, dist='tukeylambda', plot=None, N=80):
|
|
854
854
|
return svals, ppcc
|
855
855
|
|
856
856
|
|
857
|
-
def _log_mean(logx):
|
857
|
+
def _log_mean(logx, axis):
|
858
858
|
# compute log of mean of x from log(x)
|
859
|
-
|
860
|
-
|
859
|
+
return (
|
860
|
+
special.logsumexp(logx, axis=axis, keepdims=True)
|
861
|
+
- math.log(logx.shape[axis])
|
862
|
+
)
|
861
863
|
|
862
864
|
|
863
|
-
def _log_var(logx, xp):
|
865
|
+
def _log_var(logx, xp, axis):
|
864
866
|
# compute log of variance of x from log(x)
|
865
|
-
logmean = _log_mean(logx)
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
logxmu = special.logsumexp(xp.stack((logx, logmean + pij)), axis=0)
|
871
|
-
res = (xp.real(xp.asarray(special.logsumexp(2 * logxmu, axis=0)))
|
872
|
-
- math.log(logx.shape[0]))
|
873
|
-
return res
|
867
|
+
logmean = xp.broadcast_to(_log_mean(logx, axis=axis), logx.shape)
|
868
|
+
ones = xp.ones_like(logx)
|
869
|
+
logxmu, _ = special.logsumexp(xp.stack((logx, logmean), axis=0), axis=0,
|
870
|
+
b=xp.stack((ones, -ones), axis=0), return_sign=True)
|
871
|
+
return special.logsumexp(2 * logxmu, axis=axis) - math.log(logx.shape[axis])
|
874
872
|
|
875
873
|
|
876
|
-
def boxcox_llf(lmb, data):
|
874
|
+
def boxcox_llf(lmb, data, *, axis=0, keepdims=False, nan_policy='propagate'):
|
877
875
|
r"""The boxcox log-likelihood function.
|
878
876
|
|
879
877
|
Parameters
|
@@ -884,6 +882,26 @@ def boxcox_llf(lmb, data):
|
|
884
882
|
Data to calculate Box-Cox log-likelihood for. If `data` is
|
885
883
|
multi-dimensional, the log-likelihood is calculated along the first
|
886
884
|
axis.
|
885
|
+
axis : int, default: 0
|
886
|
+
If an int, the axis of the input along which to compute the statistic.
|
887
|
+
The statistic of each axis-slice (e.g. row) of the input will appear in a
|
888
|
+
corresponding element of the output.
|
889
|
+
If ``None``, the input will be raveled before computing the statistic.
|
890
|
+
nan_policy : {'propagate', 'omit', 'raise'
|
891
|
+
Defines how to handle input NaNs.
|
892
|
+
|
893
|
+
- ``propagate``: if a NaN is present in the axis slice (e.g. row) along
|
894
|
+
which the statistic is computed, the corresponding entry of the output
|
895
|
+
will be NaN.
|
896
|
+
- ``omit``: NaNs will be omitted when performing the calculation.
|
897
|
+
If insufficient data remains in the axis slice along which the
|
898
|
+
statistic is computed, the corresponding entry of the output will be
|
899
|
+
NaN.
|
900
|
+
- ``raise``: if a NaN is present, a ``ValueError`` will be raised.
|
901
|
+
keepdims : bool, default: False
|
902
|
+
If this is set to True, the axes which are reduced are left
|
903
|
+
in the result as dimensions with size one. With this option,
|
904
|
+
the result will broadcast correctly against the input array.
|
887
905
|
|
888
906
|
Returns
|
889
907
|
-------
|
@@ -897,14 +915,17 @@ def boxcox_llf(lmb, data):
|
|
897
915
|
|
898
916
|
Notes
|
899
917
|
-----
|
900
|
-
The Box-Cox log-likelihood function is defined here as
|
918
|
+
The Box-Cox log-likelihood function :math:`l` is defined here as
|
901
919
|
|
902
920
|
.. math::
|
903
921
|
|
904
|
-
|
905
|
-
N
|
922
|
+
l = (\lambda - 1) \sum_i^N \log(x_i) -
|
923
|
+
\frac{N}{2} \log\left(\sum_i^N (y_i - \bar{y})^2 / N\right),
|
906
924
|
|
907
|
-
where ``
|
925
|
+
where :math:`N` is the number of data points ``data`` and :math:`y` is the Box-Cox
|
926
|
+
transformed input data.
|
927
|
+
This corresponds to the *profile log-likelihood* of the original data :math:`x`
|
928
|
+
with some constant terms dropped.
|
908
929
|
|
909
930
|
Examples
|
910
931
|
--------
|
@@ -953,32 +974,39 @@ def boxcox_llf(lmb, data):
|
|
953
974
|
>>> plt.show()
|
954
975
|
|
955
976
|
"""
|
977
|
+
# _axis_nan_policy decorator does not currently support these for non-NumPy arrays
|
978
|
+
kwargs = {}
|
979
|
+
if keepdims is not False:
|
980
|
+
kwargs[keepdims] = keepdims
|
981
|
+
if nan_policy != 'propagate':
|
982
|
+
kwargs[nan_policy] = nan_policy
|
983
|
+
return _boxcox_llf(data, lmb=lmb, axis=axis, **kwargs)
|
984
|
+
|
985
|
+
|
986
|
+
@_axis_nan_policy_factory(lambda x: x, n_outputs=1, default_axis=0,
|
987
|
+
result_to_tuple=lambda x, _: (x,))
|
988
|
+
def _boxcox_llf(data, axis=0, *, lmb):
|
956
989
|
xp = array_namespace(data)
|
957
|
-
data =
|
958
|
-
N = data.shape[
|
990
|
+
lmb, data = xp_promote(lmb, data, force_floating=True, xp=xp)
|
991
|
+
N = data.shape[axis]
|
959
992
|
if N == 0:
|
960
|
-
return xp
|
961
|
-
|
962
|
-
dt = data.dtype
|
963
|
-
if xp.isdtype(dt, 'integral'):
|
964
|
-
data = xp.asarray(data, dtype=xp.float64)
|
965
|
-
dt = xp.float64
|
993
|
+
return _get_nan(data, xp=xp)
|
966
994
|
|
967
995
|
logdata = xp.log(data)
|
968
996
|
|
969
997
|
# Compute the variance of the transformed data.
|
970
998
|
if lmb == 0:
|
971
|
-
logvar = xp.log(xp.var(logdata, axis=
|
999
|
+
logvar = xp.log(xp.var(logdata, axis=axis))
|
972
1000
|
else:
|
973
1001
|
# Transform without the constant offset 1/lmb. The offset does
|
974
1002
|
# not affect the variance, and the subtraction of the offset can
|
975
1003
|
# lead to loss of precision.
|
976
1004
|
# Division by lmb can be factored out to enhance numerical stability.
|
977
1005
|
logx = lmb * logdata
|
978
|
-
logvar = _log_var(logx, xp) - 2 * math.log(abs(lmb))
|
1006
|
+
logvar = _log_var(logx, xp, axis) - 2 * math.log(abs(lmb))
|
979
1007
|
|
980
|
-
res = (lmb - 1) * xp.sum(logdata, axis=
|
981
|
-
res = xp.astype(res,
|
1008
|
+
res = (lmb - 1) * xp.sum(logdata, axis=axis) - N/2 * logvar
|
1009
|
+
res = xp.astype(res, data.dtype, copy=False) # compensate for NumPy <2.0
|
982
1010
|
res = res[()] if res.ndim == 0 else res
|
983
1011
|
return res
|
984
1012
|
|
@@ -1082,10 +1110,15 @@ def boxcox(x, lmbda=None, alpha=None, optimizer=None):
|
|
1082
1110
|
|
1083
1111
|
Notes
|
1084
1112
|
-----
|
1085
|
-
The Box-Cox transform is given by
|
1113
|
+
The Box-Cox transform is given by:
|
1114
|
+
|
1115
|
+
.. math::
|
1086
1116
|
|
1087
|
-
y =
|
1088
|
-
|
1117
|
+
y =
|
1118
|
+
\begin{cases}
|
1119
|
+
\frac{x^\lambda - 1}{\lambda}, &\text{for } \lambda \neq 0
|
1120
|
+
\log(x), &\text{for } \lambda = 0
|
1121
|
+
\end{cases}
|
1089
1122
|
|
1090
1123
|
`boxcox` requires the input data to be positive. Sometimes a Box-Cox
|
1091
1124
|
transformation provides a shift parameter to achieve this; `boxcox` does
|
@@ -1097,9 +1130,9 @@ def boxcox(x, lmbda=None, alpha=None, optimizer=None):
|
|
1097
1130
|
|
1098
1131
|
.. math::
|
1099
1132
|
|
1100
|
-
|
1133
|
+
l(\hat{\lambda}) - l(\lambda) < \frac{1}{2}\chi^2(1 - \alpha, 1),
|
1101
1134
|
|
1102
|
-
with
|
1135
|
+
with :math:`l` the log-likelihood function and :math:`\chi^2` the chi-squared
|
1103
1136
|
function.
|
1104
1137
|
|
1105
1138
|
References
|
@@ -1538,12 +1571,24 @@ def yeojohnson(x, lmbda=None):
|
|
1538
1571
|
|
1539
1572
|
Notes
|
1540
1573
|
-----
|
1541
|
-
The Yeo-Johnson transform is given by
|
1574
|
+
The Yeo-Johnson transform is given by:
|
1542
1575
|
|
1543
|
-
|
1544
|
-
|
1545
|
-
|
1546
|
-
|
1576
|
+
.. math::
|
1577
|
+
|
1578
|
+
y =
|
1579
|
+
\begin{cases}
|
1580
|
+
\frac{(x + 1)^\lambda - 1}{\lambda},
|
1581
|
+
&\text{for } x \geq 0, \lambda \neq 0
|
1582
|
+
\\
|
1583
|
+
\log(x + 1),
|
1584
|
+
&\text{for } x \geq 0, \lambda = 0
|
1585
|
+
\\
|
1586
|
+
-\frac{(-x + 1)^{2 - \lambda} - 1}{2 - \lambda},
|
1587
|
+
&\text{for } x < 0, \lambda \neq 2
|
1588
|
+
\\
|
1589
|
+
-\log(-x + 1),
|
1590
|
+
&\text{for } x < 0, \lambda = 2
|
1591
|
+
\end{cases}
|
1547
1592
|
|
1548
1593
|
Unlike `boxcox`, `yeojohnson` does not require the input data to be
|
1549
1594
|
positive.
|
@@ -1651,15 +1696,18 @@ def yeojohnson_llf(lmb, data):
|
|
1651
1696
|
|
1652
1697
|
Notes
|
1653
1698
|
-----
|
1654
|
-
The Yeo-Johnson log-likelihood function is defined here as
|
1699
|
+
The Yeo-Johnson log-likelihood function :math:`l` is defined here as
|
1655
1700
|
|
1656
1701
|
.. math::
|
1657
1702
|
|
1658
|
-
|
1659
|
-
\sum_i \text{
|
1703
|
+
l = -\frac{N}{2} \log(\hat{\sigma}^2) + (\lambda - 1)
|
1704
|
+
\sum_i^N \text{sign}(x_i) \log(|x_i| + 1)
|
1660
1705
|
|
1661
|
-
where :math
|
1662
|
-
|
1706
|
+
where :math:`N` is the number of data points :math:`x`=``data`` and
|
1707
|
+
:math:`\hat{\sigma}^2` is the estimated variance of the Yeo-Johnson transformed
|
1708
|
+
input data :math:`x`.
|
1709
|
+
This corresponds to the *profile log-likelihood* of the original data :math:`x`
|
1710
|
+
with some constant terms dropped.
|
1663
1711
|
|
1664
1712
|
.. versionadded:: 1.2.0
|
1665
1713
|
|
@@ -2884,7 +2932,7 @@ def bartlett(*samples, axis=0):
|
|
2884
2932
|
raise ValueError("Must enter at least two input sample vectors.")
|
2885
2933
|
|
2886
2934
|
samples = _broadcast_arrays(samples, axis=axis, xp=xp)
|
2887
|
-
samples = [
|
2935
|
+
samples = [xp.moveaxis(sample, axis, -1) for sample in samples]
|
2888
2936
|
|
2889
2937
|
Ni = [xp.asarray(sample.shape[-1], dtype=sample.dtype) for sample in samples]
|
2890
2938
|
Ni = [xp.broadcast_to(N, samples[0].shape[:-1]) for N in Ni]
|
@@ -2893,14 +2941,13 @@ def bartlett(*samples, axis=0):
|
|
2893
2941
|
ssq = [arr[xp.newaxis, ...] for arr in ssq]
|
2894
2942
|
Ni = xp.concat(Ni, axis=0)
|
2895
2943
|
ssq = xp.concat(ssq, axis=0)
|
2896
|
-
# sum dtype can be removed when 2023.12 rules kick in
|
2897
2944
|
dtype = Ni.dtype
|
2898
|
-
Ntot = xp.sum(Ni, axis=0
|
2945
|
+
Ntot = xp.sum(Ni, axis=0)
|
2899
2946
|
spsq = xp.sum((Ni - 1)*ssq, axis=0, dtype=dtype) / (Ntot - k)
|
2900
2947
|
numer = ((Ntot - k) * xp.log(spsq)
|
2901
2948
|
- xp.sum((Ni - 1)*xp.log(ssq), axis=0, dtype=dtype))
|
2902
2949
|
denom = (1 + 1/(3*(k - 1))
|
2903
|
-
* ((xp.sum(1/(Ni - 1), axis=0
|
2950
|
+
* ((xp.sum(1/(Ni - 1), axis=0)) - 1/(Ntot - k)))
|
2904
2951
|
T = numer / denom
|
2905
2952
|
|
2906
2953
|
chi2 = _SimpleChi2(xp.asarray(k-1))
|
@@ -3449,7 +3496,7 @@ def mood(x, y, axis=0, alternative="two-sided"):
|
|
3449
3496
|
WilcoxonResult = _make_tuple_bunch('WilcoxonResult', ['statistic', 'pvalue'])
|
3450
3497
|
|
3451
3498
|
|
3452
|
-
def wilcoxon_result_unpacker(res):
|
3499
|
+
def wilcoxon_result_unpacker(res, _):
|
3453
3500
|
if hasattr(res, 'zstatistic'):
|
3454
3501
|
return res.statistic, res.pvalue, res.zstatistic
|
3455
3502
|
else:
|
@@ -3870,16 +3917,15 @@ def median_test(*samples, ties='below', correction=True, lambda_=1,
|
|
3870
3917
|
# Validate the sizes and shapes of the arguments.
|
3871
3918
|
for k, d in enumerate(data):
|
3872
3919
|
if d.size == 0:
|
3873
|
-
raise ValueError("Sample
|
3874
|
-
"contain at least one value."
|
3920
|
+
raise ValueError(f"Sample {k + 1} is empty. All samples must "
|
3921
|
+
f"contain at least one value.")
|
3875
3922
|
if d.ndim != 1:
|
3876
|
-
raise ValueError("Sample
|
3877
|
-
"samples must be one-dimensional sequences."
|
3878
|
-
(k + 1, d.ndim))
|
3923
|
+
raise ValueError(f"Sample {k + 1} has {d.ndim} dimensions. "
|
3924
|
+
f"All samples must be one-dimensional sequences.")
|
3879
3925
|
|
3880
3926
|
cdata = np.concatenate(data)
|
3881
|
-
contains_nan
|
3882
|
-
if
|
3927
|
+
contains_nan = _contains_nan(cdata, nan_policy)
|
3928
|
+
if nan_policy == 'propagate' and contains_nan:
|
3883
3929
|
return MedianTestResult(np.nan, np.nan, np.nan, None)
|
3884
3930
|
|
3885
3931
|
if contains_nan:
|
@@ -3920,10 +3966,11 @@ def median_test(*samples, ties='below', correction=True, lambda_=1,
|
|
3920
3966
|
# check for that case here.
|
3921
3967
|
zero_cols = np.nonzero((table == 0).all(axis=0))[0]
|
3922
3968
|
if len(zero_cols) > 0:
|
3923
|
-
|
3924
|
-
|
3925
|
-
|
3926
|
-
|
3969
|
+
raise ValueError(
|
3970
|
+
f"All values in sample {zero_cols[0] + 1} are equal to the grand "
|
3971
|
+
f"median ({grand_median!r}), so they are ignored, resulting in an "
|
3972
|
+
f"empty sample."
|
3973
|
+
)
|
3927
3974
|
|
3928
3975
|
stat, p, dof, expected = chi2_contingency(table, lambda_=lambda_,
|
3929
3976
|
correction=correction)
|
@@ -3933,9 +3980,7 @@ def median_test(*samples, ties='below', correction=True, lambda_=1,
|
|
3933
3980
|
def _circfuncs_common(samples, period, xp=None):
|
3934
3981
|
xp = array_namespace(samples) if xp is None else xp
|
3935
3982
|
|
3936
|
-
|
3937
|
-
dtype = xp.asarray(1.).dtype # get default float type
|
3938
|
-
samples = xp.asarray(samples, dtype=dtype)
|
3983
|
+
samples = xp_promote(samples, force_floating=True, xp=xp)
|
3939
3984
|
|
3940
3985
|
# Recast samples as radians that range between 0 and 2 pi and calculate
|
3941
3986
|
# the sine and cosine
|
@@ -3948,7 +3993,7 @@ def _circfuncs_common(samples, period, xp=None):
|
|
3948
3993
|
|
3949
3994
|
@_axis_nan_policy_factory(
|
3950
3995
|
lambda x: x, n_outputs=1, default_axis=None,
|
3951
|
-
result_to_tuple=lambda x: (x,)
|
3996
|
+
result_to_tuple=lambda x, _: (x,)
|
3952
3997
|
)
|
3953
3998
|
def circmean(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
|
3954
3999
|
r"""Compute the circular mean of a sample of angle observations.
|
@@ -4041,7 +4086,7 @@ def circmean(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
|
|
4041
4086
|
|
4042
4087
|
@_axis_nan_policy_factory(
|
4043
4088
|
lambda x: x, n_outputs=1, default_axis=None,
|
4044
|
-
result_to_tuple=lambda x: (x,)
|
4089
|
+
result_to_tuple=lambda x, _: (x,)
|
4045
4090
|
)
|
4046
4091
|
def circvar(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
|
4047
4092
|
r"""Compute the circular variance of a sample of angle observations.
|
@@ -4135,7 +4180,7 @@ def circvar(samples, high=2*pi, low=0, axis=None, nan_policy='propagate'):
|
|
4135
4180
|
|
4136
4181
|
@_axis_nan_policy_factory(
|
4137
4182
|
lambda x: x, n_outputs=1, default_axis=None,
|
4138
|
-
result_to_tuple=lambda x: (x,)
|
4183
|
+
result_to_tuple=lambda x, _: (x,)
|
4139
4184
|
)
|
4140
4185
|
def circstd(samples, high=2*pi, low=0, axis=None, nan_policy='propagate', *,
|
4141
4186
|
normalize=False):
|
scipy/stats/_mstats_basic.py
CHANGED
@@ -2263,8 +2263,8 @@ def trimmed_stde(a, limits=(0.1,0.1), inclusive=(1,1), axis=None):
|
|
2263
2263
|
return _trimmed_stde_1D(a.ravel(),lolim,uplim,loinc,upinc)
|
2264
2264
|
else:
|
2265
2265
|
if a.ndim > 2:
|
2266
|
-
raise ValueError("Array 'a' must be at most two dimensional, "
|
2267
|
-
"but got a.ndim =
|
2266
|
+
raise ValueError(f"Array 'a' must be at most two dimensional, "
|
2267
|
+
f"but got a.ndim = {a.ndim}")
|
2268
2268
|
return ma.apply_along_axis(_trimmed_stde_1D, axis, a,
|
2269
2269
|
lolim,uplim,loinc,upinc)
|
2270
2270
|
|
@@ -2641,7 +2641,7 @@ def winsorize(a, limits=None, inclusive=(True, True), inplace=False,
|
|
2641
2641
|
a[idx[upidx:]] = a[idx[upidx - 1]]
|
2642
2642
|
return a
|
2643
2643
|
|
2644
|
-
contains_nan
|
2644
|
+
contains_nan = _contains_nan(a, nan_policy)
|
2645
2645
|
# We are going to modify a: better make a copy
|
2646
2646
|
a = ma.array(a, copy=np.logical_not(inplace))
|
2647
2647
|
|
@@ -3016,8 +3016,8 @@ def stde_median(data, axis=None):
|
|
3016
3016
|
return _stdemed_1D(data)
|
3017
3017
|
else:
|
3018
3018
|
if data.ndim > 2:
|
3019
|
-
raise ValueError("Array 'data' must be at most two dimensional, "
|
3020
|
-
"but got data.ndim =
|
3019
|
+
raise ValueError(f"Array 'data' must be at most two dimensional, "
|
3020
|
+
f"but got data.ndim = {data.ndim}")
|
3021
3021
|
return ma.apply_along_axis(_stdemed_1D, axis, data)
|
3022
3022
|
|
3023
3023
|
|
@@ -3067,9 +3067,8 @@ def skewtest(a, axis=0, alternative='two-sided'):
|
|
3067
3067
|
b2 = skew(a,axis)
|
3068
3068
|
n = a.count(axis)
|
3069
3069
|
if np.min(n) < 8:
|
3070
|
-
raise ValueError(
|
3071
|
-
|
3072
|
-
" were given." % np.min(n))
|
3070
|
+
raise ValueError(f"skewtest is not valid with less than 8 samples; "
|
3071
|
+
f"{np.min(n)} samples were given.")
|
3073
3072
|
|
3074
3073
|
y = b2 * ma.sqrt(((n+1)*(n+3)) / (6.0*(n-2)))
|
3075
3074
|
beta2 = (3.0*(n*n+27*n-70)*(n+1)*(n+3)) / ((n-2.0)*(n+5)*(n+7)*(n+9))
|
@@ -3125,14 +3124,11 @@ def kurtosistest(a, axis=0, alternative='two-sided'):
|
|
3125
3124
|
a, axis = _chk_asarray(a, axis)
|
3126
3125
|
n = a.count(axis=axis)
|
3127
3126
|
if np.min(n) < 5:
|
3128
|
-
raise ValueError(
|
3129
|
-
|
3130
|
-
" were given." % np.min(n))
|
3127
|
+
raise ValueError(f"kurtosistest requires at least 5 observations; "
|
3128
|
+
f"{np.min(n)} observations were given.")
|
3131
3129
|
if np.min(n) < 20:
|
3132
|
-
warnings.warn(
|
3133
|
-
|
3134
|
-
stacklevel=2,
|
3135
|
-
)
|
3130
|
+
warnings.warn(f"kurtosistest only valid for n>=20 ... continuing "
|
3131
|
+
f"anyway, n={np.min(n)}", stacklevel=2)
|
3136
3132
|
|
3137
3133
|
b2 = kurtosis(a, axis, fisher=False)
|
3138
3134
|
E = 3.0*(n-1) / (n+1)
|
@@ -3535,8 +3531,8 @@ def friedmanchisquare(*args):
|
|
3535
3531
|
data = argstoarray(*args).astype(float)
|
3536
3532
|
k = len(data)
|
3537
3533
|
if k < 3:
|
3538
|
-
raise ValueError("Less than 3 groups (
|
3539
|
-
"
|
3534
|
+
raise ValueError(f"Less than 3 groups ({k}): the Friedman test "
|
3535
|
+
f"is NOT appropriate.")
|
3540
3536
|
|
3541
3537
|
ranked = ma.masked_values(rankdata(data, axis=0), 0)
|
3542
3538
|
if ranked._mask is not nomask:
|
scipy/stats/_mstats_extras.py
CHANGED
@@ -114,8 +114,8 @@ def hdquantiles(data, prob=(.25, .5, .75), axis=None, var=False,):
|
|
114
114
|
result = _hd_1D(data, p, var)
|
115
115
|
else:
|
116
116
|
if data.ndim > 2:
|
117
|
-
raise ValueError("Array 'data' must be at most two dimensional, "
|
118
|
-
"but got data.ndim =
|
117
|
+
raise ValueError(f"Array 'data' must be at most two dimensional, "
|
118
|
+
f"but got data.ndim = {data.ndim}")
|
119
119
|
result = ma.apply_along_axis(_hd_1D, axis, data, p, var)
|
120
120
|
|
121
121
|
return ma.fix_invalid(result, copy=False)
|
@@ -203,8 +203,8 @@ def hdquantiles_sd(data, prob=(.25, .5, .75), axis=None):
|
|
203
203
|
result = _hdsd_1D(data, p)
|
204
204
|
else:
|
205
205
|
if data.ndim > 2:
|
206
|
-
raise ValueError("Array 'data' must be at most two dimensional, "
|
207
|
-
"but got data.ndim =
|
206
|
+
raise ValueError(f"Array 'data' must be at most two dimensional, "
|
207
|
+
f"but got data.ndim = {data.ndim}")
|
208
208
|
result = ma.apply_along_axis(_hdsd_1D, axis, data, p)
|
209
209
|
|
210
210
|
return ma.fix_invalid(result, copy=False).ravel()
|
@@ -295,8 +295,8 @@ def mjci(data, prob=(0.25, 0.5, 0.75), axis=None):
|
|
295
295
|
|
296
296
|
data = ma.array(data, copy=False)
|
297
297
|
if data.ndim > 2:
|
298
|
-
raise ValueError("Array 'data' must be at most two dimensional, "
|
299
|
-
"but got data.ndim =
|
298
|
+
raise ValueError(f"Array 'data' must be at most two dimensional, "
|
299
|
+
f"but got data.ndim = {data.ndim}")
|
300
300
|
|
301
301
|
p = np.atleast_1d(np.asarray(prob))
|
302
302
|
# Computes quantiles along axis (or globally)
|
@@ -384,8 +384,8 @@ def median_cihs(data, alpha=0.05, axis=None):
|
|
384
384
|
result = _cihs_1D(data, alpha)
|
385
385
|
else:
|
386
386
|
if data.ndim > 2:
|
387
|
-
raise ValueError("Array 'data' must be at most two dimensional, "
|
388
|
-
"but got data.ndim =
|
387
|
+
raise ValueError(f"Array 'data' must be at most two dimensional, "
|
388
|
+
f"but got data.ndim = {data.ndim}")
|
389
389
|
result = ma.apply_along_axis(_cihs_1D, axis, data, alpha)
|
390
390
|
|
391
391
|
return result
|