scipy 1.16.2__cp312-cp312-win_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 +161 -0
- scipy/__init__.py +150 -0
- scipy/_cyutility.cp312-win_arm64.lib +0 -0
- scipy/_cyutility.cp312-win_arm64.pyd +0 -0
- scipy/_distributor_init.py +18 -0
- scipy/_lib/__init__.py +14 -0
- scipy/_lib/_array_api.py +931 -0
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_array_api_no_0d.py +103 -0
- scipy/_lib/_bunch.py +229 -0
- scipy/_lib/_ccallback.py +251 -0
- scipy/_lib/_ccallback_c.cp312-win_arm64.lib +0 -0
- scipy/_lib/_ccallback_c.cp312-win_arm64.pyd +0 -0
- scipy/_lib/_disjoint_set.py +254 -0
- scipy/_lib/_docscrape.py +761 -0
- scipy/_lib/_elementwise_iterative_method.py +346 -0
- scipy/_lib/_fpumode.cp312-win_arm64.lib +0 -0
- scipy/_lib/_fpumode.cp312-win_arm64.pyd +0 -0
- scipy/_lib/_gcutils.py +105 -0
- scipy/_lib/_pep440.py +487 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp312-win_arm64.lib +0 -0
- scipy/_lib/_test_ccallback.cp312-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp312-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_call.cp312-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp312-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_def.cp312-win_arm64.pyd +0 -0
- scipy/_lib/_testutils.py +373 -0
- scipy/_lib/_threadsafety.py +58 -0
- scipy/_lib/_tmpdirs.py +86 -0
- scipy/_lib/_uarray/LICENSE +29 -0
- scipy/_lib/_uarray/__init__.py +116 -0
- scipy/_lib/_uarray/_backend.py +707 -0
- scipy/_lib/_uarray/_uarray.cp312-win_arm64.lib +0 -0
- scipy/_lib/_uarray/_uarray.cp312-win_arm64.pyd +0 -0
- scipy/_lib/_util.py +1283 -0
- scipy/_lib/array_api_compat/__init__.py +22 -0
- scipy/_lib/array_api_compat/_internal.py +59 -0
- scipy/_lib/array_api_compat/common/__init__.py +1 -0
- scipy/_lib/array_api_compat/common/_aliases.py +727 -0
- scipy/_lib/array_api_compat/common/_fft.py +213 -0
- scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
- scipy/_lib/array_api_compat/common/_linalg.py +232 -0
- scipy/_lib/array_api_compat/common/_typing.py +192 -0
- scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
- scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
- scipy/_lib/array_api_compat/cupy/_info.py +336 -0
- scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
- scipy/_lib/array_api_compat/cupy/fft.py +36 -0
- scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
- scipy/_lib/array_api_compat/dask/__init__.py +0 -0
- scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
- scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
- scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
- scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
- scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
- scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
- scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
- scipy/_lib/array_api_compat/numpy/_info.py +366 -0
- scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
- scipy/_lib/array_api_compat/numpy/fft.py +35 -0
- scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
- scipy/_lib/array_api_compat/torch/__init__.py +22 -0
- scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
- scipy/_lib/array_api_compat/torch/_info.py +369 -0
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +85 -0
- scipy/_lib/array_api_compat/torch/linalg.py +121 -0
- scipy/_lib/array_api_extra/__init__.py +38 -0
- 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/cobyqa/__init__.py +20 -0
- scipy/_lib/cobyqa/framework.py +1240 -0
- scipy/_lib/cobyqa/main.py +1506 -0
- scipy/_lib/cobyqa/models.py +1529 -0
- scipy/_lib/cobyqa/problem.py +1296 -0
- scipy/_lib/cobyqa/settings.py +132 -0
- scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
- scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
- scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
- scipy/_lib/cobyqa/utils/__init__.py +18 -0
- scipy/_lib/cobyqa/utils/exceptions.py +22 -0
- scipy/_lib/cobyqa/utils/math.py +77 -0
- scipy/_lib/cobyqa/utils/versions.py +67 -0
- scipy/_lib/decorator.py +399 -0
- scipy/_lib/deprecation.py +274 -0
- scipy/_lib/doccer.py +366 -0
- scipy/_lib/messagestream.cp312-win_arm64.lib +0 -0
- scipy/_lib/messagestream.cp312-win_arm64.pyd +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/__init__.py +0 -0
- scipy/_lib/tests/test__gcutils.py +110 -0
- scipy/_lib/tests/test__pep440.py +67 -0
- scipy/_lib/tests/test__testutils.py +32 -0
- scipy/_lib/tests/test__threadsafety.py +51 -0
- scipy/_lib/tests/test__util.py +641 -0
- scipy/_lib/tests/test_array_api.py +322 -0
- scipy/_lib/tests/test_bunch.py +169 -0
- scipy/_lib/tests/test_ccallback.py +196 -0
- scipy/_lib/tests/test_config.py +45 -0
- scipy/_lib/tests/test_deprecation.py +10 -0
- scipy/_lib/tests/test_doccer.py +143 -0
- scipy/_lib/tests/test_import_cycles.py +18 -0
- scipy/_lib/tests/test_public_api.py +482 -0
- scipy/_lib/tests/test_scipy_version.py +28 -0
- scipy/_lib/tests/test_tmpdirs.py +48 -0
- scipy/_lib/tests/test_warnings.py +137 -0
- scipy/_lib/uarray.py +31 -0
- scipy/cluster/__init__.py +31 -0
- scipy/cluster/_hierarchy.cp312-win_arm64.lib +0 -0
- scipy/cluster/_hierarchy.cp312-win_arm64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.lib +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.pyd +0 -0
- scipy/cluster/_vq.cp312-win_arm64.lib +0 -0
- scipy/cluster/_vq.cp312-win_arm64.pyd +0 -0
- scipy/cluster/hierarchy.py +4348 -0
- scipy/cluster/tests/__init__.py +0 -0
- scipy/cluster/tests/hierarchy_test_data.py +145 -0
- scipy/cluster/tests/test_disjoint_set.py +202 -0
- scipy/cluster/tests/test_hierarchy.py +1238 -0
- scipy/cluster/tests/test_vq.py +434 -0
- scipy/cluster/vq.py +832 -0
- scipy/conftest.py +683 -0
- scipy/constants/__init__.py +358 -0
- scipy/constants/_codata.py +2266 -0
- scipy/constants/_constants.py +369 -0
- scipy/constants/codata.py +21 -0
- scipy/constants/constants.py +53 -0
- scipy/constants/tests/__init__.py +0 -0
- scipy/constants/tests/test_codata.py +78 -0
- scipy/constants/tests/test_constants.py +83 -0
- scipy/datasets/__init__.py +90 -0
- scipy/datasets/_download_all.py +71 -0
- scipy/datasets/_fetchers.py +225 -0
- scipy/datasets/_registry.py +26 -0
- scipy/datasets/_utils.py +81 -0
- scipy/datasets/tests/__init__.py +0 -0
- scipy/datasets/tests/test_data.py +128 -0
- scipy/differentiate/__init__.py +27 -0
- scipy/differentiate/_differentiate.py +1129 -0
- scipy/differentiate/tests/__init__.py +0 -0
- scipy/differentiate/tests/test_differentiate.py +694 -0
- scipy/fft/__init__.py +114 -0
- scipy/fft/_backend.py +196 -0
- scipy/fft/_basic.py +1650 -0
- scipy/fft/_basic_backend.py +197 -0
- scipy/fft/_debug_backends.py +22 -0
- scipy/fft/_fftlog.py +223 -0
- scipy/fft/_fftlog_backend.py +200 -0
- scipy/fft/_helper.py +348 -0
- scipy/fft/_pocketfft/LICENSE.md +25 -0
- scipy/fft/_pocketfft/__init__.py +9 -0
- scipy/fft/_pocketfft/basic.py +251 -0
- scipy/fft/_pocketfft/helper.py +249 -0
- scipy/fft/_pocketfft/pypocketfft.cp312-win_arm64.lib +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp312-win_arm64.pyd +0 -0
- scipy/fft/_pocketfft/realtransforms.py +109 -0
- scipy/fft/_pocketfft/tests/__init__.py +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
- scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
- scipy/fft/_realtransforms.py +706 -0
- scipy/fft/_realtransforms_backend.py +63 -0
- scipy/fft/tests/__init__.py +0 -0
- scipy/fft/tests/mock_backend.py +96 -0
- scipy/fft/tests/test_backend.py +98 -0
- scipy/fft/tests/test_basic.py +504 -0
- scipy/fft/tests/test_fftlog.py +215 -0
- scipy/fft/tests/test_helper.py +558 -0
- scipy/fft/tests/test_multithreading.py +84 -0
- scipy/fft/tests/test_real_transforms.py +247 -0
- scipy/fftpack/__init__.py +103 -0
- scipy/fftpack/_basic.py +428 -0
- scipy/fftpack/_helper.py +115 -0
- scipy/fftpack/_pseudo_diffs.py +554 -0
- scipy/fftpack/_realtransforms.py +598 -0
- scipy/fftpack/basic.py +20 -0
- scipy/fftpack/convolve.cp312-win_arm64.lib +0 -0
- scipy/fftpack/convolve.cp312-win_arm64.pyd +0 -0
- scipy/fftpack/helper.py +19 -0
- scipy/fftpack/pseudo_diffs.py +22 -0
- scipy/fftpack/realtransforms.py +19 -0
- scipy/fftpack/tests/__init__.py +0 -0
- scipy/fftpack/tests/fftw_double_ref.npz +0 -0
- scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
- scipy/fftpack/tests/fftw_single_ref.npz +0 -0
- scipy/fftpack/tests/test.npz +0 -0
- scipy/fftpack/tests/test_basic.py +877 -0
- scipy/fftpack/tests/test_helper.py +54 -0
- scipy/fftpack/tests/test_import.py +33 -0
- scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
- scipy/fftpack/tests/test_real_transforms.py +836 -0
- scipy/integrate/__init__.py +122 -0
- scipy/integrate/_bvp.py +1160 -0
- scipy/integrate/_cubature.py +729 -0
- scipy/integrate/_dop.cp312-win_arm64.lib +0 -0
- scipy/integrate/_dop.cp312-win_arm64.pyd +0 -0
- scipy/integrate/_ivp/__init__.py +8 -0
- scipy/integrate/_ivp/base.py +290 -0
- scipy/integrate/_ivp/bdf.py +478 -0
- scipy/integrate/_ivp/common.py +451 -0
- scipy/integrate/_ivp/dop853_coefficients.py +193 -0
- scipy/integrate/_ivp/ivp.py +755 -0
- scipy/integrate/_ivp/lsoda.py +224 -0
- scipy/integrate/_ivp/radau.py +572 -0
- scipy/integrate/_ivp/rk.py +601 -0
- scipy/integrate/_ivp/tests/__init__.py +0 -0
- scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
- scipy/integrate/_ivp/tests/test_rk.py +37 -0
- scipy/integrate/_lebedev.py +5450 -0
- scipy/integrate/_lsoda.cp312-win_arm64.lib +0 -0
- scipy/integrate/_lsoda.cp312-win_arm64.pyd +0 -0
- scipy/integrate/_ode.py +1395 -0
- scipy/integrate/_odepack.cp312-win_arm64.lib +0 -0
- scipy/integrate/_odepack.cp312-win_arm64.pyd +0 -0
- scipy/integrate/_odepack_py.py +273 -0
- scipy/integrate/_quad_vec.py +674 -0
- scipy/integrate/_quadpack.cp312-win_arm64.lib +0 -0
- scipy/integrate/_quadpack.cp312-win_arm64.pyd +0 -0
- scipy/integrate/_quadpack_py.py +1283 -0
- scipy/integrate/_quadrature.py +1336 -0
- scipy/integrate/_rules/__init__.py +12 -0
- scipy/integrate/_rules/_base.py +518 -0
- scipy/integrate/_rules/_gauss_kronrod.py +202 -0
- scipy/integrate/_rules/_gauss_legendre.py +62 -0
- scipy/integrate/_rules/_genz_malik.py +210 -0
- scipy/integrate/_tanhsinh.py +1385 -0
- scipy/integrate/_test_multivariate.cp312-win_arm64.lib +0 -0
- scipy/integrate/_test_multivariate.cp312-win_arm64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp312-win_arm64.lib +0 -0
- scipy/integrate/_test_odeint_banded.cp312-win_arm64.pyd +0 -0
- scipy/integrate/_vode.cp312-win_arm64.lib +0 -0
- scipy/integrate/_vode.cp312-win_arm64.pyd +0 -0
- scipy/integrate/dop.py +15 -0
- scipy/integrate/lsoda.py +15 -0
- scipy/integrate/odepack.py +17 -0
- scipy/integrate/quadpack.py +23 -0
- scipy/integrate/tests/__init__.py +0 -0
- scipy/integrate/tests/test__quad_vec.py +211 -0
- scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
- scipy/integrate/tests/test_bvp.py +714 -0
- scipy/integrate/tests/test_cubature.py +1375 -0
- scipy/integrate/tests/test_integrate.py +840 -0
- scipy/integrate/tests/test_odeint_jac.py +74 -0
- scipy/integrate/tests/test_quadpack.py +680 -0
- scipy/integrate/tests/test_quadrature.py +730 -0
- scipy/integrate/tests/test_tanhsinh.py +1171 -0
- scipy/integrate/vode.py +15 -0
- scipy/interpolate/__init__.py +228 -0
- scipy/interpolate/_bary_rational.py +715 -0
- scipy/interpolate/_bsplines.py +2469 -0
- scipy/interpolate/_cubic.py +973 -0
- scipy/interpolate/_dfitpack.cp312-win_arm64.lib +0 -0
- scipy/interpolate/_dfitpack.cp312-win_arm64.pyd +0 -0
- scipy/interpolate/_dierckx.cp312-win_arm64.lib +0 -0
- scipy/interpolate/_dierckx.cp312-win_arm64.pyd +0 -0
- scipy/interpolate/_fitpack.cp312-win_arm64.lib +0 -0
- scipy/interpolate/_fitpack.cp312-win_arm64.pyd +0 -0
- scipy/interpolate/_fitpack2.py +2397 -0
- scipy/interpolate/_fitpack_impl.py +811 -0
- scipy/interpolate/_fitpack_py.py +898 -0
- scipy/interpolate/_fitpack_repro.py +996 -0
- scipy/interpolate/_interpnd.cp312-win_arm64.lib +0 -0
- scipy/interpolate/_interpnd.cp312-win_arm64.pyd +0 -0
- scipy/interpolate/_interpolate.py +2266 -0
- scipy/interpolate/_ndbspline.py +415 -0
- scipy/interpolate/_ndgriddata.py +329 -0
- scipy/interpolate/_pade.py +67 -0
- scipy/interpolate/_polyint.py +1025 -0
- scipy/interpolate/_ppoly.cp312-win_arm64.lib +0 -0
- scipy/interpolate/_ppoly.cp312-win_arm64.pyd +0 -0
- scipy/interpolate/_rbf.py +290 -0
- scipy/interpolate/_rbfinterp.py +550 -0
- scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.lib +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.pyd +0 -0
- scipy/interpolate/_rgi.py +764 -0
- scipy/interpolate/_rgi_cython.cp312-win_arm64.lib +0 -0
- scipy/interpolate/_rgi_cython.cp312-win_arm64.pyd +0 -0
- scipy/interpolate/dfitpack.py +24 -0
- scipy/interpolate/fitpack.py +31 -0
- scipy/interpolate/fitpack2.py +29 -0
- scipy/interpolate/interpnd.py +24 -0
- scipy/interpolate/interpolate.py +30 -0
- scipy/interpolate/ndgriddata.py +23 -0
- scipy/interpolate/polyint.py +24 -0
- scipy/interpolate/rbf.py +18 -0
- scipy/interpolate/tests/__init__.py +0 -0
- scipy/interpolate/tests/data/bug-1310.npz +0 -0
- scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
- scipy/interpolate/tests/data/gcvspl.npz +0 -0
- scipy/interpolate/tests/test_bary_rational.py +368 -0
- scipy/interpolate/tests/test_bsplines.py +3754 -0
- scipy/interpolate/tests/test_fitpack.py +519 -0
- scipy/interpolate/tests/test_fitpack2.py +1431 -0
- scipy/interpolate/tests/test_gil.py +64 -0
- scipy/interpolate/tests/test_interpnd.py +452 -0
- scipy/interpolate/tests/test_interpolate.py +2630 -0
- scipy/interpolate/tests/test_ndgriddata.py +308 -0
- scipy/interpolate/tests/test_pade.py +107 -0
- scipy/interpolate/tests/test_polyint.py +972 -0
- scipy/interpolate/tests/test_rbf.py +246 -0
- scipy/interpolate/tests/test_rbfinterp.py +534 -0
- scipy/interpolate/tests/test_rgi.py +1151 -0
- scipy/io/__init__.py +116 -0
- scipy/io/_fast_matrix_market/__init__.py +600 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp312-win_arm64.lib +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp312-win_arm64.pyd +0 -0
- scipy/io/_fortran.py +354 -0
- scipy/io/_harwell_boeing/__init__.py +7 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
- scipy/io/_harwell_boeing/hb.py +571 -0
- scipy/io/_harwell_boeing/tests/__init__.py +0 -0
- scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
- scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
- scipy/io/_idl.py +917 -0
- scipy/io/_mmio.py +968 -0
- scipy/io/_netcdf.py +1104 -0
- scipy/io/_test_fortran.cp312-win_arm64.lib +0 -0
- scipy/io/_test_fortran.cp312-win_arm64.pyd +0 -0
- scipy/io/arff/__init__.py +28 -0
- scipy/io/arff/_arffread.py +873 -0
- scipy/io/arff/arffread.py +19 -0
- scipy/io/arff/tests/__init__.py +0 -0
- scipy/io/arff/tests/data/iris.arff +225 -0
- scipy/io/arff/tests/data/missing.arff +8 -0
- scipy/io/arff/tests/data/nodata.arff +11 -0
- scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
- scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
- scipy/io/arff/tests/data/test1.arff +10 -0
- scipy/io/arff/tests/data/test10.arff +8 -0
- scipy/io/arff/tests/data/test11.arff +11 -0
- scipy/io/arff/tests/data/test2.arff +15 -0
- scipy/io/arff/tests/data/test3.arff +6 -0
- scipy/io/arff/tests/data/test4.arff +11 -0
- scipy/io/arff/tests/data/test5.arff +26 -0
- scipy/io/arff/tests/data/test6.arff +12 -0
- scipy/io/arff/tests/data/test7.arff +15 -0
- scipy/io/arff/tests/data/test8.arff +12 -0
- scipy/io/arff/tests/data/test9.arff +14 -0
- scipy/io/arff/tests/test_arffread.py +421 -0
- scipy/io/harwell_boeing.py +17 -0
- scipy/io/idl.py +17 -0
- scipy/io/matlab/__init__.py +66 -0
- scipy/io/matlab/_byteordercodes.py +75 -0
- scipy/io/matlab/_mio.py +375 -0
- scipy/io/matlab/_mio4.py +632 -0
- scipy/io/matlab/_mio5.py +901 -0
- scipy/io/matlab/_mio5_params.py +281 -0
- scipy/io/matlab/_mio5_utils.cp312-win_arm64.lib +0 -0
- scipy/io/matlab/_mio5_utils.cp312-win_arm64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp312-win_arm64.lib +0 -0
- scipy/io/matlab/_mio_utils.cp312-win_arm64.pyd +0 -0
- scipy/io/matlab/_miobase.py +435 -0
- scipy/io/matlab/_streams.cp312-win_arm64.lib +0 -0
- scipy/io/matlab/_streams.cp312-win_arm64.pyd +0 -0
- scipy/io/matlab/byteordercodes.py +17 -0
- scipy/io/matlab/mio.py +16 -0
- scipy/io/matlab/mio4.py +17 -0
- scipy/io/matlab/mio5.py +19 -0
- scipy/io/matlab/mio5_params.py +18 -0
- scipy/io/matlab/mio5_utils.py +17 -0
- scipy/io/matlab/mio_utils.py +17 -0
- scipy/io/matlab/miobase.py +16 -0
- scipy/io/matlab/streams.py +16 -0
- scipy/io/matlab/tests/__init__.py +0 -0
- scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
- scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/big_endian.mat +0 -0
- scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
- scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
- scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
- scipy/io/matlab/tests/data/little_endian.mat +0 -0
- scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
- scipy/io/matlab/tests/data/malformed1.mat +0 -0
- scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
- scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
- scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
- scipy/io/matlab/tests/data/parabola.mat +0 -0
- scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
- scipy/io/matlab/tests/data/some_functions.mat +0 -0
- scipy/io/matlab/tests/data/sqr.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
- scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
- scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
- scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/test_byteordercodes.py +29 -0
- scipy/io/matlab/tests/test_mio.py +1399 -0
- scipy/io/matlab/tests/test_mio5_utils.py +179 -0
- scipy/io/matlab/tests/test_mio_funcs.py +51 -0
- scipy/io/matlab/tests/test_mio_utils.py +45 -0
- scipy/io/matlab/tests/test_miobase.py +32 -0
- scipy/io/matlab/tests/test_pathological.py +33 -0
- scipy/io/matlab/tests/test_streams.py +241 -0
- scipy/io/mmio.py +17 -0
- scipy/io/netcdf.py +17 -0
- scipy/io/tests/__init__.py +0 -0
- scipy/io/tests/data/Transparent Busy.ani +0 -0
- scipy/io/tests/data/array_float32_1d.sav +0 -0
- scipy/io/tests/data/array_float32_2d.sav +0 -0
- scipy/io/tests/data/array_float32_3d.sav +0 -0
- scipy/io/tests/data/array_float32_4d.sav +0 -0
- scipy/io/tests/data/array_float32_5d.sav +0 -0
- scipy/io/tests/data/array_float32_6d.sav +0 -0
- scipy/io/tests/data/array_float32_7d.sav +0 -0
- scipy/io/tests/data/array_float32_8d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
- scipy/io/tests/data/example_1.nc +0 -0
- scipy/io/tests/data/example_2.nc +0 -0
- scipy/io/tests/data/example_3_maskedvals.nc +0 -0
- scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
- scipy/io/tests/data/fortran-mixed.dat +0 -0
- scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
- scipy/io/tests/data/invalid_pointer.sav +0 -0
- scipy/io/tests/data/null_pointer.sav +0 -0
- scipy/io/tests/data/scalar_byte.sav +0 -0
- scipy/io/tests/data/scalar_byte_descr.sav +0 -0
- scipy/io/tests/data/scalar_complex32.sav +0 -0
- scipy/io/tests/data/scalar_complex64.sav +0 -0
- scipy/io/tests/data/scalar_float32.sav +0 -0
- scipy/io/tests/data/scalar_float64.sav +0 -0
- scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
- scipy/io/tests/data/scalar_int16.sav +0 -0
- scipy/io/tests/data/scalar_int32.sav +0 -0
- scipy/io/tests/data/scalar_int64.sav +0 -0
- scipy/io/tests/data/scalar_string.sav +0 -0
- scipy/io/tests/data/scalar_uint16.sav +0 -0
- scipy/io/tests/data/scalar_uint32.sav +0 -0
- scipy/io/tests/data/scalar_uint64.sav +0 -0
- scipy/io/tests/data/struct_arrays.sav +0 -0
- scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_inherit.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_pointers.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_scalars.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
- scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
- scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
- scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
- scipy/io/tests/data/various_compressed.sav +0 -0
- scipy/io/tests/test_fortran.py +264 -0
- scipy/io/tests/test_idl.py +483 -0
- scipy/io/tests/test_mmio.py +831 -0
- scipy/io/tests/test_netcdf.py +550 -0
- scipy/io/tests/test_paths.py +93 -0
- scipy/io/tests/test_wavfile.py +501 -0
- scipy/io/wavfile.py +938 -0
- scipy/linalg/__init__.pxd +1 -0
- scipy/linalg/__init__.py +236 -0
- scipy/linalg/_basic.py +2146 -0
- scipy/linalg/_blas_subroutines.h +164 -0
- scipy/linalg/_cythonized_array_utils.cp312-win_arm64.lib +0 -0
- scipy/linalg/_cythonized_array_utils.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_cythonized_array_utils.pxd +40 -0
- scipy/linalg/_cythonized_array_utils.pyi +16 -0
- scipy/linalg/_decomp.py +1645 -0
- scipy/linalg/_decomp_cholesky.py +413 -0
- scipy/linalg/_decomp_cossin.py +236 -0
- scipy/linalg/_decomp_interpolative.cp312-win_arm64.lib +0 -0
- scipy/linalg/_decomp_interpolative.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +356 -0
- scipy/linalg/_decomp_lu.py +401 -0
- scipy/linalg/_decomp_lu_cython.cp312-win_arm64.lib +0 -0
- scipy/linalg/_decomp_lu_cython.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_decomp_lu_cython.pyi +6 -0
- scipy/linalg/_decomp_polar.py +113 -0
- scipy/linalg/_decomp_qr.py +494 -0
- scipy/linalg/_decomp_qz.py +452 -0
- scipy/linalg/_decomp_schur.py +336 -0
- scipy/linalg/_decomp_svd.py +545 -0
- scipy/linalg/_decomp_update.cp312-win_arm64.lib +0 -0
- scipy/linalg/_decomp_update.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +417 -0
- scipy/linalg/_fblas.cp312-win_arm64.lib +0 -0
- scipy/linalg/_fblas.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_flapack.cp312-win_arm64.lib +0 -0
- scipy/linalg/_flapack.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_lapack_subroutines.h +1521 -0
- scipy/linalg/_linalg_pythran.cp312-win_arm64.lib +0 -0
- scipy/linalg/_linalg_pythran.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs.py +1050 -0
- scipy/linalg/_matfuncs_expm.cp312-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_expm.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs_expm.pyi +6 -0
- scipy/linalg/_matfuncs_inv_ssq.py +886 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +107 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_misc.py +191 -0
- scipy/linalg/_procrustes.py +113 -0
- scipy/linalg/_sketches.py +189 -0
- scipy/linalg/_solve_toeplitz.cp312-win_arm64.lib +0 -0
- scipy/linalg/_solve_toeplitz.cp312-win_arm64.pyd +0 -0
- scipy/linalg/_solvers.py +862 -0
- scipy/linalg/_special_matrices.py +1322 -0
- scipy/linalg/_testutils.py +65 -0
- scipy/linalg/basic.py +23 -0
- scipy/linalg/blas.py +495 -0
- scipy/linalg/cython_blas.cp312-win_arm64.lib +0 -0
- scipy/linalg/cython_blas.cp312-win_arm64.pyd +0 -0
- scipy/linalg/cython_blas.pxd +169 -0
- scipy/linalg/cython_blas.pyx +1432 -0
- scipy/linalg/cython_lapack.cp312-win_arm64.lib +0 -0
- scipy/linalg/cython_lapack.cp312-win_arm64.pyd +0 -0
- scipy/linalg/cython_lapack.pxd +1528 -0
- scipy/linalg/cython_lapack.pyx +12045 -0
- scipy/linalg/decomp.py +23 -0
- scipy/linalg/decomp_cholesky.py +21 -0
- scipy/linalg/decomp_lu.py +21 -0
- scipy/linalg/decomp_qr.py +20 -0
- scipy/linalg/decomp_schur.py +21 -0
- scipy/linalg/decomp_svd.py +21 -0
- scipy/linalg/interpolative.py +989 -0
- scipy/linalg/lapack.py +1081 -0
- scipy/linalg/matfuncs.py +23 -0
- scipy/linalg/misc.py +21 -0
- scipy/linalg/special_matrices.py +22 -0
- scipy/linalg/tests/__init__.py +0 -0
- scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
- scipy/linalg/tests/_cython_examples/meson.build +34 -0
- scipy/linalg/tests/data/carex_15_data.npz +0 -0
- scipy/linalg/tests/data/carex_18_data.npz +0 -0
- scipy/linalg/tests/data/carex_19_data.npz +0 -0
- scipy/linalg/tests/data/carex_20_data.npz +0 -0
- scipy/linalg/tests/data/carex_6_data.npz +0 -0
- scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
- scipy/linalg/tests/test_basic.py +2074 -0
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_blas.py +1127 -0
- scipy/linalg/tests/test_cython_blas.py +118 -0
- scipy/linalg/tests/test_cython_lapack.py +22 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
- scipy/linalg/tests/test_decomp.py +3189 -0
- scipy/linalg/tests/test_decomp_cholesky.py +268 -0
- scipy/linalg/tests/test_decomp_cossin.py +314 -0
- scipy/linalg/tests/test_decomp_ldl.py +137 -0
- scipy/linalg/tests/test_decomp_lu.py +308 -0
- scipy/linalg/tests/test_decomp_polar.py +110 -0
- scipy/linalg/tests/test_decomp_update.py +1701 -0
- scipy/linalg/tests/test_extending.py +46 -0
- scipy/linalg/tests/test_fblas.py +607 -0
- scipy/linalg/tests/test_interpolative.py +232 -0
- scipy/linalg/tests/test_lapack.py +3620 -0
- scipy/linalg/tests/test_matfuncs.py +1125 -0
- scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
- scipy/linalg/tests/test_procrustes.py +214 -0
- scipy/linalg/tests/test_sketches.py +118 -0
- scipy/linalg/tests/test_solve_toeplitz.py +150 -0
- scipy/linalg/tests/test_solvers.py +844 -0
- scipy/linalg/tests/test_special_matrices.py +636 -0
- scipy/misc/__init__.py +6 -0
- scipy/misc/common.py +6 -0
- scipy/misc/doccer.py +6 -0
- scipy/ndimage/__init__.py +174 -0
- scipy/ndimage/_ctest.cp312-win_arm64.lib +0 -0
- scipy/ndimage/_ctest.cp312-win_arm64.pyd +0 -0
- scipy/ndimage/_cytest.cp312-win_arm64.lib +0 -0
- scipy/ndimage/_cytest.cp312-win_arm64.pyd +0 -0
- scipy/ndimage/_delegators.py +303 -0
- scipy/ndimage/_filters.py +2422 -0
- scipy/ndimage/_fourier.py +306 -0
- scipy/ndimage/_interpolation.py +1033 -0
- scipy/ndimage/_measurements.py +1689 -0
- scipy/ndimage/_morphology.py +2634 -0
- scipy/ndimage/_nd_image.cp312-win_arm64.lib +0 -0
- scipy/ndimage/_nd_image.cp312-win_arm64.pyd +0 -0
- scipy/ndimage/_ndimage_api.py +16 -0
- scipy/ndimage/_ni_docstrings.py +214 -0
- scipy/ndimage/_ni_label.cp312-win_arm64.lib +0 -0
- scipy/ndimage/_ni_label.cp312-win_arm64.pyd +0 -0
- scipy/ndimage/_ni_support.py +139 -0
- scipy/ndimage/_rank_filter_1d.cp312-win_arm64.lib +0 -0
- scipy/ndimage/_rank_filter_1d.cp312-win_arm64.pyd +0 -0
- scipy/ndimage/_support_alternative_backends.py +84 -0
- scipy/ndimage/filters.py +27 -0
- scipy/ndimage/fourier.py +21 -0
- scipy/ndimage/interpolation.py +22 -0
- scipy/ndimage/measurements.py +24 -0
- scipy/ndimage/morphology.py +27 -0
- scipy/ndimage/tests/__init__.py +12 -0
- scipy/ndimage/tests/data/label_inputs.txt +21 -0
- scipy/ndimage/tests/data/label_results.txt +294 -0
- scipy/ndimage/tests/data/label_strels.txt +42 -0
- scipy/ndimage/tests/dots.png +0 -0
- scipy/ndimage/tests/test_c_api.py +102 -0
- scipy/ndimage/tests/test_datatypes.py +67 -0
- scipy/ndimage/tests/test_filters.py +3083 -0
- scipy/ndimage/tests/test_fourier.py +187 -0
- scipy/ndimage/tests/test_interpolation.py +1491 -0
- scipy/ndimage/tests/test_measurements.py +1592 -0
- scipy/ndimage/tests/test_morphology.py +2950 -0
- scipy/ndimage/tests/test_ni_support.py +78 -0
- scipy/ndimage/tests/test_splines.py +70 -0
- scipy/odr/__init__.py +131 -0
- scipy/odr/__odrpack.cp312-win_arm64.lib +0 -0
- scipy/odr/__odrpack.cp312-win_arm64.pyd +0 -0
- scipy/odr/_add_newdocs.py +34 -0
- scipy/odr/_models.py +315 -0
- scipy/odr/_odrpack.py +1154 -0
- scipy/odr/models.py +20 -0
- scipy/odr/odrpack.py +21 -0
- scipy/odr/tests/__init__.py +0 -0
- scipy/odr/tests/test_odr.py +607 -0
- scipy/optimize/__init__.pxd +1 -0
- scipy/optimize/__init__.py +460 -0
- scipy/optimize/_basinhopping.py +741 -0
- scipy/optimize/_bglu_dense.cp312-win_arm64.lib +0 -0
- scipy/optimize/_bglu_dense.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_bracket.py +706 -0
- scipy/optimize/_chandrupatla.py +551 -0
- scipy/optimize/_cobyla_py.py +297 -0
- scipy/optimize/_cobyqa_py.py +72 -0
- scipy/optimize/_constraints.py +598 -0
- scipy/optimize/_dcsrch.py +728 -0
- scipy/optimize/_differentiable_functions.py +835 -0
- scipy/optimize/_differentialevolution.py +1970 -0
- scipy/optimize/_direct.cp312-win_arm64.lib +0 -0
- scipy/optimize/_direct.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_direct_py.py +280 -0
- scipy/optimize/_dual_annealing.py +732 -0
- scipy/optimize/_elementwise.py +798 -0
- scipy/optimize/_group_columns.cp312-win_arm64.lib +0 -0
- scipy/optimize/_group_columns.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_hessian_update_strategy.py +479 -0
- scipy/optimize/_highspy/__init__.py +0 -0
- scipy/optimize/_highspy/_core.cp312-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_core.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp312-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_highs_options.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_wrapper.py +338 -0
- scipy/optimize/_isotonic.py +157 -0
- scipy/optimize/_lbfgsb.cp312-win_arm64.lib +0 -0
- scipy/optimize/_lbfgsb.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_lbfgsb_py.py +634 -0
- scipy/optimize/_linesearch.py +896 -0
- scipy/optimize/_linprog.py +733 -0
- scipy/optimize/_linprog_doc.py +1434 -0
- scipy/optimize/_linprog_highs.py +422 -0
- scipy/optimize/_linprog_ip.py +1141 -0
- scipy/optimize/_linprog_rs.py +572 -0
- scipy/optimize/_linprog_simplex.py +663 -0
- scipy/optimize/_linprog_util.py +1521 -0
- scipy/optimize/_lsap.cp312-win_arm64.lib +0 -0
- scipy/optimize/_lsap.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_lsq/__init__.py +5 -0
- scipy/optimize/_lsq/bvls.py +183 -0
- scipy/optimize/_lsq/common.py +731 -0
- scipy/optimize/_lsq/dogbox.py +345 -0
- scipy/optimize/_lsq/givens_elimination.cp312-win_arm64.lib +0 -0
- scipy/optimize/_lsq/givens_elimination.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_lsq/least_squares.py +1044 -0
- scipy/optimize/_lsq/lsq_linear.py +361 -0
- scipy/optimize/_lsq/trf.py +587 -0
- scipy/optimize/_lsq/trf_linear.py +249 -0
- scipy/optimize/_milp.py +394 -0
- scipy/optimize/_minimize.py +1199 -0
- scipy/optimize/_minpack.cp312-win_arm64.lib +0 -0
- scipy/optimize/_minpack.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_minpack_py.py +1178 -0
- scipy/optimize/_moduleTNC.cp312-win_arm64.lib +0 -0
- scipy/optimize/_moduleTNC.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_nnls.py +96 -0
- scipy/optimize/_nonlin.py +1634 -0
- scipy/optimize/_numdiff.py +963 -0
- scipy/optimize/_optimize.py +4169 -0
- scipy/optimize/_pava_pybind.cp312-win_arm64.lib +0 -0
- scipy/optimize/_pava_pybind.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_qap.py +760 -0
- scipy/optimize/_remove_redundancy.py +522 -0
- scipy/optimize/_root.py +732 -0
- scipy/optimize/_root_scalar.py +538 -0
- scipy/optimize/_shgo.py +1606 -0
- scipy/optimize/_shgo_lib/__init__.py +0 -0
- scipy/optimize/_shgo_lib/_complex.py +1225 -0
- scipy/optimize/_shgo_lib/_vertex.py +460 -0
- scipy/optimize/_slsqp_py.py +603 -0
- scipy/optimize/_slsqplib.cp312-win_arm64.lib +0 -0
- scipy/optimize/_slsqplib.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_spectral.py +260 -0
- scipy/optimize/_tnc.py +438 -0
- scipy/optimize/_trlib/__init__.py +12 -0
- scipy/optimize/_trlib/_trlib.cp312-win_arm64.lib +0 -0
- scipy/optimize/_trlib/_trlib.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_trustregion.py +318 -0
- scipy/optimize/_trustregion_constr/__init__.py +6 -0
- scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
- scipy/optimize/_trustregion_constr/projections.py +411 -0
- scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
- scipy/optimize/_trustregion_constr/report.py +49 -0
- scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
- scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
- scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
- scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
- scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
- scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
- scipy/optimize/_trustregion_dogleg.py +122 -0
- scipy/optimize/_trustregion_exact.py +437 -0
- scipy/optimize/_trustregion_krylov.py +65 -0
- scipy/optimize/_trustregion_ncg.py +126 -0
- scipy/optimize/_tstutils.py +972 -0
- scipy/optimize/_zeros.cp312-win_arm64.lib +0 -0
- scipy/optimize/_zeros.cp312-win_arm64.pyd +0 -0
- scipy/optimize/_zeros_py.py +1475 -0
- scipy/optimize/cobyla.py +19 -0
- scipy/optimize/cython_optimize/__init__.py +133 -0
- scipy/optimize/cython_optimize/_zeros.cp312-win_arm64.lib +0 -0
- scipy/optimize/cython_optimize/_zeros.cp312-win_arm64.pyd +0 -0
- scipy/optimize/cython_optimize/_zeros.pxd +33 -0
- scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
- scipy/optimize/cython_optimize.pxd +11 -0
- scipy/optimize/elementwise.py +38 -0
- scipy/optimize/lbfgsb.py +23 -0
- scipy/optimize/linesearch.py +18 -0
- scipy/optimize/minpack.py +27 -0
- scipy/optimize/minpack2.py +17 -0
- scipy/optimize/moduleTNC.py +19 -0
- scipy/optimize/nonlin.py +29 -0
- scipy/optimize/optimize.py +40 -0
- scipy/optimize/slsqp.py +22 -0
- scipy/optimize/tests/__init__.py +0 -0
- scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
- scipy/optimize/tests/_cython_examples/meson.build +32 -0
- scipy/optimize/tests/test__basinhopping.py +535 -0
- scipy/optimize/tests/test__differential_evolution.py +1703 -0
- scipy/optimize/tests/test__dual_annealing.py +416 -0
- scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
- scipy/optimize/tests/test__numdiff.py +885 -0
- scipy/optimize/tests/test__remove_redundancy.py +228 -0
- scipy/optimize/tests/test__root.py +124 -0
- scipy/optimize/tests/test__shgo.py +1164 -0
- scipy/optimize/tests/test__spectral.py +226 -0
- scipy/optimize/tests/test_bracket.py +896 -0
- scipy/optimize/tests/test_chandrupatla.py +982 -0
- scipy/optimize/tests/test_cobyla.py +195 -0
- scipy/optimize/tests/test_cobyqa.py +252 -0
- scipy/optimize/tests/test_constraint_conversion.py +286 -0
- scipy/optimize/tests/test_constraints.py +255 -0
- scipy/optimize/tests/test_cython_optimize.py +92 -0
- scipy/optimize/tests/test_differentiable_functions.py +1025 -0
- scipy/optimize/tests/test_direct.py +321 -0
- scipy/optimize/tests/test_extending.py +28 -0
- scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
- scipy/optimize/tests/test_isotonic_regression.py +167 -0
- scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
- scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
- scipy/optimize/tests/test_least_squares.py +986 -0
- scipy/optimize/tests/test_linear_assignment.py +116 -0
- scipy/optimize/tests/test_linesearch.py +328 -0
- scipy/optimize/tests/test_linprog.py +2577 -0
- scipy/optimize/tests/test_lsq_common.py +297 -0
- scipy/optimize/tests/test_lsq_linear.py +287 -0
- scipy/optimize/tests/test_milp.py +459 -0
- scipy/optimize/tests/test_minimize_constrained.py +845 -0
- scipy/optimize/tests/test_minpack.py +1194 -0
- scipy/optimize/tests/test_nnls.py +469 -0
- scipy/optimize/tests/test_nonlin.py +572 -0
- scipy/optimize/tests/test_optimize.py +3344 -0
- scipy/optimize/tests/test_quadratic_assignment.py +455 -0
- scipy/optimize/tests/test_regression.py +40 -0
- scipy/optimize/tests/test_slsqp.py +645 -0
- scipy/optimize/tests/test_tnc.py +345 -0
- scipy/optimize/tests/test_trustregion.py +110 -0
- scipy/optimize/tests/test_trustregion_exact.py +351 -0
- scipy/optimize/tests/test_trustregion_krylov.py +170 -0
- scipy/optimize/tests/test_zeros.py +998 -0
- scipy/optimize/tnc.py +22 -0
- scipy/optimize/zeros.py +26 -0
- scipy/signal/__init__.py +316 -0
- scipy/signal/_arraytools.py +264 -0
- scipy/signal/_czt.py +575 -0
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +5893 -0
- scipy/signal/_fir_filter_design.py +1458 -0
- scipy/signal/_lti_conversion.py +534 -0
- scipy/signal/_ltisys.py +3546 -0
- scipy/signal/_max_len_seq.py +139 -0
- scipy/signal/_max_len_seq_inner.cp312-win_arm64.lib +0 -0
- scipy/signal/_max_len_seq_inner.cp312-win_arm64.pyd +0 -0
- scipy/signal/_peak_finding.py +1310 -0
- scipy/signal/_peak_finding_utils.cp312-win_arm64.lib +0 -0
- scipy/signal/_peak_finding_utils.cp312-win_arm64.pyd +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_savitzky_golay.py +357 -0
- scipy/signal/_short_time_fft.py +2228 -0
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +5309 -0
- scipy/signal/_sigtools.cp312-win_arm64.lib +0 -0
- scipy/signal/_sigtools.cp312-win_arm64.pyd +0 -0
- scipy/signal/_sosfilt.cp312-win_arm64.lib +0 -0
- scipy/signal/_sosfilt.cp312-win_arm64.pyd +0 -0
- scipy/signal/_spectral_py.py +2471 -0
- scipy/signal/_spline.cp312-win_arm64.lib +0 -0
- scipy/signal/_spline.cp312-win_arm64.pyd +0 -0
- scipy/signal/_spline.pyi +34 -0
- scipy/signal/_spline_filters.py +848 -0
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +219 -0
- scipy/signal/_upfirdn_apply.cp312-win_arm64.lib +0 -0
- scipy/signal/_upfirdn_apply.cp312-win_arm64.pyd +0 -0
- scipy/signal/_waveforms.py +687 -0
- scipy/signal/_wavelets.py +29 -0
- scipy/signal/bsplines.py +21 -0
- scipy/signal/filter_design.py +28 -0
- scipy/signal/fir_filter_design.py +21 -0
- scipy/signal/lti_conversion.py +20 -0
- scipy/signal/ltisys.py +25 -0
- scipy/signal/signaltools.py +27 -0
- scipy/signal/spectral.py +21 -0
- scipy/signal/spline.py +18 -0
- scipy/signal/tests/__init__.py +0 -0
- scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
- scipy/signal/tests/mpsig.py +122 -0
- scipy/signal/tests/test_array_tools.py +111 -0
- scipy/signal/tests/test_bsplines.py +365 -0
- scipy/signal/tests/test_cont2discrete.py +424 -0
- scipy/signal/tests/test_czt.py +221 -0
- scipy/signal/tests/test_dltisys.py +599 -0
- scipy/signal/tests/test_filter_design.py +4744 -0
- scipy/signal/tests/test_fir_filter_design.py +851 -0
- scipy/signal/tests/test_ltisys.py +1225 -0
- scipy/signal/tests/test_max_len_seq.py +71 -0
- scipy/signal/tests/test_peak_finding.py +915 -0
- scipy/signal/tests/test_result_type.py +51 -0
- scipy/signal/tests/test_savitzky_golay.py +363 -0
- scipy/signal/tests/test_short_time_fft.py +1107 -0
- scipy/signal/tests/test_signaltools.py +4735 -0
- scipy/signal/tests/test_spectral.py +2141 -0
- scipy/signal/tests/test_splines.py +427 -0
- scipy/signal/tests/test_upfirdn.py +322 -0
- scipy/signal/tests/test_waveforms.py +400 -0
- scipy/signal/tests/test_wavelets.py +59 -0
- scipy/signal/tests/test_windows.py +987 -0
- scipy/signal/waveforms.py +20 -0
- scipy/signal/wavelets.py +17 -0
- scipy/signal/windows/__init__.py +52 -0
- scipy/signal/windows/_windows.py +2513 -0
- scipy/signal/windows/windows.py +23 -0
- scipy/sparse/__init__.py +350 -0
- scipy/sparse/_base.py +1613 -0
- scipy/sparse/_bsr.py +880 -0
- scipy/sparse/_compressed.py +1328 -0
- scipy/sparse/_construct.py +1454 -0
- scipy/sparse/_coo.py +1581 -0
- scipy/sparse/_csc.py +367 -0
- scipy/sparse/_csparsetools.cp312-win_arm64.lib +0 -0
- scipy/sparse/_csparsetools.cp312-win_arm64.pyd +0 -0
- scipy/sparse/_csr.py +558 -0
- scipy/sparse/_data.py +569 -0
- scipy/sparse/_dia.py +677 -0
- scipy/sparse/_dok.py +669 -0
- scipy/sparse/_extract.py +178 -0
- scipy/sparse/_index.py +444 -0
- scipy/sparse/_lil.py +632 -0
- scipy/sparse/_matrix.py +169 -0
- scipy/sparse/_matrix_io.py +167 -0
- scipy/sparse/_sparsetools.cp312-win_arm64.lib +0 -0
- scipy/sparse/_sparsetools.cp312-win_arm64.pyd +0 -0
- scipy/sparse/_spfuncs.py +76 -0
- scipy/sparse/_sputils.py +632 -0
- scipy/sparse/base.py +24 -0
- scipy/sparse/bsr.py +22 -0
- scipy/sparse/compressed.py +20 -0
- scipy/sparse/construct.py +38 -0
- scipy/sparse/coo.py +23 -0
- scipy/sparse/csc.py +22 -0
- scipy/sparse/csgraph/__init__.py +210 -0
- scipy/sparse/csgraph/_flow.cp312-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_flow.cp312-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_laplacian.py +563 -0
- scipy/sparse/csgraph/_matching.cp312-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_matching.cp312-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp312-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_reordering.cp312-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp312-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_tools.cp312-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp312-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_traversal.cp312-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_validation.py +66 -0
- scipy/sparse/csgraph/tests/__init__.py +0 -0
- scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
- scipy/sparse/csgraph/tests/test_conversions.py +61 -0
- scipy/sparse/csgraph/tests/test_flow.py +209 -0
- scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
- scipy/sparse/csgraph/tests/test_matching.py +307 -0
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
- scipy/sparse/csgraph/tests/test_reordering.py +70 -0
- scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
- scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
- scipy/sparse/csgraph/tests/test_traversal.py +148 -0
- scipy/sparse/csr.py +22 -0
- scipy/sparse/data.py +18 -0
- scipy/sparse/dia.py +22 -0
- scipy/sparse/dok.py +22 -0
- scipy/sparse/extract.py +23 -0
- scipy/sparse/lil.py +22 -0
- scipy/sparse/linalg/__init__.py +148 -0
- scipy/sparse/linalg/_dsolve/__init__.py +71 -0
- scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp312-win_arm64.lib +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp312-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
- scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
- scipy/sparse/linalg/_eigen/__init__.py +22 -0
- scipy/sparse/linalg/_eigen/_svds.py +540 -0
- scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
- scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
- scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_arm64.lib +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
- scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
- scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
- scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
- scipy/sparse/linalg/_expm_multiply.py +816 -0
- scipy/sparse/linalg/_interface.py +920 -0
- scipy/sparse/linalg/_isolve/__init__.py +20 -0
- scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
- scipy/sparse/linalg/_isolve/iterative.py +1051 -0
- scipy/sparse/linalg/_isolve/lgmres.py +230 -0
- scipy/sparse/linalg/_isolve/lsmr.py +486 -0
- scipy/sparse/linalg/_isolve/lsqr.py +589 -0
- scipy/sparse/linalg/_isolve/minres.py +372 -0
- scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
- scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
- scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
- scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
- scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
- scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
- scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
- scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
- scipy/sparse/linalg/_isolve/utils.py +121 -0
- scipy/sparse/linalg/_matfuncs.py +940 -0
- scipy/sparse/linalg/_norm.py +195 -0
- scipy/sparse/linalg/_onenormest.py +467 -0
- scipy/sparse/linalg/_propack/_cpropack.cp312-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp312-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp312-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp312-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
- scipy/sparse/linalg/_svdp.py +309 -0
- scipy/sparse/linalg/dsolve.py +22 -0
- scipy/sparse/linalg/eigen.py +21 -0
- scipy/sparse/linalg/interface.py +20 -0
- scipy/sparse/linalg/isolve.py +22 -0
- scipy/sparse/linalg/matfuncs.py +18 -0
- scipy/sparse/linalg/tests/__init__.py +0 -0
- scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
- scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
- scipy/sparse/linalg/tests/test_interface.py +561 -0
- scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
- scipy/sparse/linalg/tests/test_norm.py +154 -0
- scipy/sparse/linalg/tests/test_onenormest.py +252 -0
- scipy/sparse/linalg/tests/test_propack.py +165 -0
- scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
- scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
- scipy/sparse/sparsetools.py +17 -0
- scipy/sparse/spfuncs.py +17 -0
- scipy/sparse/sputils.py +17 -0
- scipy/sparse/tests/__init__.py +0 -0
- scipy/sparse/tests/data/csc_py2.npz +0 -0
- scipy/sparse/tests/data/csc_py3.npz +0 -0
- scipy/sparse/tests/test_arithmetic1d.py +341 -0
- scipy/sparse/tests/test_array_api.py +561 -0
- scipy/sparse/tests/test_base.py +5870 -0
- scipy/sparse/tests/test_common1d.py +447 -0
- scipy/sparse/tests/test_construct.py +872 -0
- scipy/sparse/tests/test_coo.py +1119 -0
- scipy/sparse/tests/test_csc.py +98 -0
- scipy/sparse/tests/test_csr.py +214 -0
- scipy/sparse/tests/test_dok.py +209 -0
- scipy/sparse/tests/test_extract.py +51 -0
- scipy/sparse/tests/test_indexing1d.py +603 -0
- scipy/sparse/tests/test_matrix_io.py +109 -0
- scipy/sparse/tests/test_minmax1d.py +128 -0
- scipy/sparse/tests/test_sparsetools.py +344 -0
- scipy/sparse/tests/test_spfuncs.py +97 -0
- scipy/sparse/tests/test_sputils.py +424 -0
- scipy/spatial/__init__.py +129 -0
- scipy/spatial/_ckdtree.cp312-win_arm64.lib +0 -0
- scipy/spatial/_ckdtree.cp312-win_arm64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp312-win_arm64.lib +0 -0
- scipy/spatial/_distance_pybind.cp312-win_arm64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp312-win_arm64.lib +0 -0
- scipy/spatial/_distance_wrap.cp312-win_arm64.pyd +0 -0
- scipy/spatial/_geometric_slerp.py +238 -0
- scipy/spatial/_hausdorff.cp312-win_arm64.lib +0 -0
- scipy/spatial/_hausdorff.cp312-win_arm64.pyd +0 -0
- scipy/spatial/_kdtree.py +920 -0
- scipy/spatial/_plotutils.py +274 -0
- scipy/spatial/_procrustes.py +132 -0
- scipy/spatial/_qhull.cp312-win_arm64.lib +0 -0
- scipy/spatial/_qhull.cp312-win_arm64.pyd +0 -0
- scipy/spatial/_qhull.pyi +213 -0
- scipy/spatial/_spherical_voronoi.py +341 -0
- scipy/spatial/_voronoi.cp312-win_arm64.lib +0 -0
- scipy/spatial/_voronoi.cp312-win_arm64.pyd +0 -0
- scipy/spatial/_voronoi.pyi +4 -0
- scipy/spatial/ckdtree.py +18 -0
- scipy/spatial/distance.py +3147 -0
- scipy/spatial/distance.pyi +210 -0
- scipy/spatial/kdtree.py +25 -0
- scipy/spatial/qhull.py +25 -0
- scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
- scipy/spatial/tests/__init__.py +0 -0
- scipy/spatial/tests/data/cdist-X1.txt +10 -0
- scipy/spatial/tests/data/cdist-X2.txt +20 -0
- scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
- scipy/spatial/tests/data/iris.txt +150 -0
- scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
- scipy/spatial/tests/data/random-bool-data.txt +100 -0
- scipy/spatial/tests/data/random-double-data.txt +100 -0
- scipy/spatial/tests/data/random-int-data.txt +100 -0
- scipy/spatial/tests/data/random-uint-data.txt +100 -0
- scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
- scipy/spatial/tests/test__plotutils.py +91 -0
- scipy/spatial/tests/test__procrustes.py +116 -0
- scipy/spatial/tests/test_distance.py +2389 -0
- scipy/spatial/tests/test_hausdorff.py +199 -0
- scipy/spatial/tests/test_kdtree.py +1536 -0
- scipy/spatial/tests/test_qhull.py +1313 -0
- scipy/spatial/tests/test_slerp.py +417 -0
- scipy/spatial/tests/test_spherical_voronoi.py +358 -0
- scipy/spatial/transform/__init__.py +31 -0
- scipy/spatial/transform/_rigid_transform.cp312-win_arm64.lib +0 -0
- scipy/spatial/transform/_rigid_transform.cp312-win_arm64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp312-win_arm64.lib +0 -0
- scipy/spatial/transform/_rotation.cp312-win_arm64.pyd +0 -0
- scipy/spatial/transform/_rotation_groups.py +140 -0
- scipy/spatial/transform/_rotation_spline.py +460 -0
- scipy/spatial/transform/rotation.py +21 -0
- scipy/spatial/transform/tests/__init__.py +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +2569 -0
- scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
- scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
- scipy/special/__init__.pxd +1 -0
- scipy/special/__init__.py +841 -0
- scipy/special/_add_newdocs.py +9961 -0
- scipy/special/_basic.py +3576 -0
- scipy/special/_comb.cp312-win_arm64.lib +0 -0
- scipy/special/_comb.cp312-win_arm64.pyd +0 -0
- scipy/special/_ellip_harm.py +214 -0
- scipy/special/_ellip_harm_2.cp312-win_arm64.lib +0 -0
- scipy/special/_ellip_harm_2.cp312-win_arm64.pyd +0 -0
- scipy/special/_gufuncs.cp312-win_arm64.lib +0 -0
- scipy/special/_gufuncs.cp312-win_arm64.pyd +0 -0
- scipy/special/_input_validation.py +17 -0
- scipy/special/_lambertw.py +149 -0
- scipy/special/_logsumexp.py +426 -0
- scipy/special/_mptestutils.py +453 -0
- scipy/special/_multiufuncs.py +610 -0
- scipy/special/_orthogonal.py +2592 -0
- scipy/special/_orthogonal.pyi +330 -0
- scipy/special/_precompute/__init__.py +0 -0
- scipy/special/_precompute/cosine_cdf.py +17 -0
- scipy/special/_precompute/expn_asy.py +54 -0
- scipy/special/_precompute/gammainc_asy.py +116 -0
- scipy/special/_precompute/gammainc_data.py +124 -0
- scipy/special/_precompute/hyp2f1_data.py +484 -0
- scipy/special/_precompute/lambertw.py +68 -0
- scipy/special/_precompute/loggamma.py +43 -0
- scipy/special/_precompute/struve_convergence.py +131 -0
- scipy/special/_precompute/utils.py +38 -0
- scipy/special/_precompute/wright_bessel.py +342 -0
- scipy/special/_precompute/wright_bessel_data.py +152 -0
- scipy/special/_precompute/wrightomega.py +41 -0
- scipy/special/_precompute/zetac.py +27 -0
- scipy/special/_sf_error.py +15 -0
- scipy/special/_specfun.cp312-win_arm64.lib +0 -0
- scipy/special/_specfun.cp312-win_arm64.pyd +0 -0
- scipy/special/_special_ufuncs.cp312-win_arm64.lib +0 -0
- scipy/special/_special_ufuncs.cp312-win_arm64.pyd +0 -0
- scipy/special/_spfun_stats.py +106 -0
- scipy/special/_spherical_bessel.py +397 -0
- scipy/special/_support_alternative_backends.py +295 -0
- scipy/special/_test_internal.cp312-win_arm64.lib +0 -0
- scipy/special/_test_internal.cp312-win_arm64.pyd +0 -0
- scipy/special/_test_internal.pyi +9 -0
- scipy/special/_testutils.py +321 -0
- scipy/special/_ufuncs.cp312-win_arm64.lib +0 -0
- scipy/special/_ufuncs.cp312-win_arm64.pyd +0 -0
- scipy/special/_ufuncs.pyi +522 -0
- scipy/special/_ufuncs.pyx +13173 -0
- scipy/special/_ufuncs_cxx.cp312-win_arm64.lib +0 -0
- scipy/special/_ufuncs_cxx.cp312-win_arm64.pyd +0 -0
- scipy/special/_ufuncs_cxx.pxd +142 -0
- scipy/special/_ufuncs_cxx.pyx +427 -0
- scipy/special/_ufuncs_cxx_defs.h +147 -0
- scipy/special/_ufuncs_defs.h +57 -0
- scipy/special/add_newdocs.py +15 -0
- scipy/special/basic.py +87 -0
- scipy/special/cython_special.cp312-win_arm64.lib +0 -0
- scipy/special/cython_special.cp312-win_arm64.pyd +0 -0
- scipy/special/cython_special.pxd +259 -0
- scipy/special/cython_special.pyi +3 -0
- scipy/special/orthogonal.py +45 -0
- scipy/special/sf_error.py +20 -0
- scipy/special/specfun.py +24 -0
- scipy/special/spfun_stats.py +17 -0
- scipy/special/tests/__init__.py +0 -0
- scipy/special/tests/_cython_examples/extending.pyx +12 -0
- scipy/special/tests/_cython_examples/meson.build +34 -0
- scipy/special/tests/data/__init__.py +0 -0
- scipy/special/tests/data/boost.npz +0 -0
- scipy/special/tests/data/gsl.npz +0 -0
- scipy/special/tests/data/local.npz +0 -0
- scipy/special/tests/test_basic.py +4815 -0
- scipy/special/tests/test_bdtr.py +112 -0
- scipy/special/tests/test_boost_ufuncs.py +64 -0
- scipy/special/tests/test_boxcox.py +125 -0
- scipy/special/tests/test_cdflib.py +712 -0
- scipy/special/tests/test_cdft_asymptotic.py +49 -0
- scipy/special/tests/test_cephes_intp_cast.py +29 -0
- scipy/special/tests/test_cosine_distr.py +83 -0
- scipy/special/tests/test_cython_special.py +363 -0
- scipy/special/tests/test_data.py +719 -0
- scipy/special/tests/test_dd.py +42 -0
- scipy/special/tests/test_digamma.py +45 -0
- scipy/special/tests/test_ellip_harm.py +278 -0
- scipy/special/tests/test_erfinv.py +89 -0
- scipy/special/tests/test_exponential_integrals.py +118 -0
- scipy/special/tests/test_extending.py +28 -0
- scipy/special/tests/test_faddeeva.py +85 -0
- scipy/special/tests/test_gamma.py +12 -0
- scipy/special/tests/test_gammainc.py +152 -0
- scipy/special/tests/test_hyp2f1.py +2566 -0
- scipy/special/tests/test_hypergeometric.py +234 -0
- scipy/special/tests/test_iv_ratio.py +249 -0
- scipy/special/tests/test_kolmogorov.py +491 -0
- scipy/special/tests/test_lambertw.py +109 -0
- scipy/special/tests/test_legendre.py +1518 -0
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_loggamma.py +70 -0
- scipy/special/tests/test_logit.py +162 -0
- scipy/special/tests/test_logsumexp.py +469 -0
- scipy/special/tests/test_mpmath.py +2293 -0
- scipy/special/tests/test_nan_inputs.py +65 -0
- scipy/special/tests/test_ndtr.py +77 -0
- scipy/special/tests/test_ndtri_exp.py +94 -0
- scipy/special/tests/test_orthogonal.py +821 -0
- scipy/special/tests/test_orthogonal_eval.py +275 -0
- scipy/special/tests/test_owens_t.py +53 -0
- scipy/special/tests/test_pcf.py +24 -0
- scipy/special/tests/test_pdtr.py +48 -0
- scipy/special/tests/test_powm1.py +65 -0
- scipy/special/tests/test_precompute_expn_asy.py +24 -0
- scipy/special/tests/test_precompute_gammainc.py +108 -0
- scipy/special/tests/test_precompute_utils.py +36 -0
- scipy/special/tests/test_round.py +18 -0
- scipy/special/tests/test_sf_error.py +146 -0
- scipy/special/tests/test_sici.py +36 -0
- scipy/special/tests/test_specfun.py +48 -0
- scipy/special/tests/test_spence.py +32 -0
- scipy/special/tests/test_spfun_stats.py +61 -0
- scipy/special/tests/test_sph_harm.py +85 -0
- scipy/special/tests/test_spherical_bessel.py +400 -0
- scipy/special/tests/test_support_alternative_backends.py +248 -0
- scipy/special/tests/test_trig.py +72 -0
- scipy/special/tests/test_ufunc_signatures.py +46 -0
- scipy/special/tests/test_wright_bessel.py +205 -0
- scipy/special/tests/test_wrightomega.py +117 -0
- scipy/special/tests/test_zeta.py +301 -0
- scipy/stats/__init__.py +670 -0
- scipy/stats/_ansari_swilk_statistics.cp312-win_arm64.lib +0 -0
- scipy/stats/_ansari_swilk_statistics.cp312-win_arm64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +692 -0
- scipy/stats/_biasedurn.cp312-win_arm64.lib +0 -0
- scipy/stats/_biasedurn.cp312-win_arm64.pyd +0 -0
- scipy/stats/_biasedurn.pxd +27 -0
- scipy/stats/_binned_statistic.py +795 -0
- scipy/stats/_binomtest.py +375 -0
- scipy/stats/_bws_test.py +177 -0
- scipy/stats/_censored_data.py +459 -0
- scipy/stats/_common.py +5 -0
- scipy/stats/_constants.py +42 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +12486 -0
- scipy/stats/_correlation.py +210 -0
- scipy/stats/_covariance.py +636 -0
- scipy/stats/_crosstab.py +204 -0
- scipy/stats/_discrete_distns.py +2098 -0
- scipy/stats/_distn_infrastructure.py +4201 -0
- scipy/stats/_distr_params.py +299 -0
- scipy/stats/_distribution_infrastructure.py +5750 -0
- scipy/stats/_entropy.py +428 -0
- scipy/stats/_finite_differences.py +145 -0
- scipy/stats/_fit.py +1351 -0
- scipy/stats/_hypotests.py +2060 -0
- scipy/stats/_kde.py +732 -0
- scipy/stats/_ksstats.py +600 -0
- scipy/stats/_levy_stable/__init__.py +1231 -0
- scipy/stats/_levy_stable/levyst.cp312-win_arm64.lib +0 -0
- scipy/stats/_levy_stable/levyst.cp312-win_arm64.pyd +0 -0
- scipy/stats/_mannwhitneyu.py +492 -0
- scipy/stats/_mgc.py +550 -0
- scipy/stats/_morestats.py +4626 -0
- scipy/stats/_mstats_basic.py +3658 -0
- scipy/stats/_mstats_extras.py +521 -0
- scipy/stats/_multicomp.py +449 -0
- scipy/stats/_multivariate.py +7281 -0
- scipy/stats/_new_distributions.py +452 -0
- scipy/stats/_odds_ratio.py +466 -0
- scipy/stats/_page_trend_test.py +486 -0
- scipy/stats/_probability_distribution.py +1964 -0
- scipy/stats/_qmc.py +2956 -0
- scipy/stats/_qmc_cy.cp312-win_arm64.lib +0 -0
- scipy/stats/_qmc_cy.cp312-win_arm64.pyd +0 -0
- scipy/stats/_qmc_cy.pyi +54 -0
- scipy/stats/_qmvnt.py +454 -0
- scipy/stats/_qmvnt_cy.cp312-win_arm64.lib +0 -0
- scipy/stats/_qmvnt_cy.cp312-win_arm64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/__init__.py +4 -0
- scipy/stats/_rcont/rcont.cp312-win_arm64.lib +0 -0
- scipy/stats/_rcont/rcont.cp312-win_arm64.pyd +0 -0
- scipy/stats/_relative_risk.py +263 -0
- scipy/stats/_resampling.py +2352 -0
- scipy/stats/_result_classes.py +40 -0
- scipy/stats/_sampling.py +1314 -0
- scipy/stats/_sensitivity_analysis.py +713 -0
- scipy/stats/_sobol.cp312-win_arm64.lib +0 -0
- scipy/stats/_sobol.cp312-win_arm64.pyd +0 -0
- scipy/stats/_sobol.pyi +54 -0
- scipy/stats/_sobol_direction_numbers.npz +0 -0
- scipy/stats/_stats.cp312-win_arm64.lib +0 -0
- scipy/stats/_stats.cp312-win_arm64.pyd +0 -0
- scipy/stats/_stats.pxd +10 -0
- scipy/stats/_stats_mstats_common.py +322 -0
- scipy/stats/_stats_py.py +11089 -0
- scipy/stats/_stats_pythran.cp312-win_arm64.lib +0 -0
- scipy/stats/_stats_pythran.cp312-win_arm64.pyd +0 -0
- scipy/stats/_survival.py +683 -0
- scipy/stats/_tukeylambda_stats.py +199 -0
- scipy/stats/_unuran/__init__.py +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp312-win_arm64.lib +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp312-win_arm64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
- scipy/stats/_variation.py +126 -0
- scipy/stats/_warnings_errors.py +38 -0
- scipy/stats/_wilcoxon.py +265 -0
- scipy/stats/biasedurn.py +16 -0
- scipy/stats/contingency.py +521 -0
- scipy/stats/distributions.py +24 -0
- scipy/stats/kde.py +18 -0
- scipy/stats/morestats.py +27 -0
- scipy/stats/mstats.py +140 -0
- scipy/stats/mstats_basic.py +42 -0
- scipy/stats/mstats_extras.py +25 -0
- scipy/stats/mvn.py +17 -0
- scipy/stats/qmc.py +236 -0
- scipy/stats/sampling.py +73 -0
- scipy/stats/stats.py +41 -0
- scipy/stats/tests/__init__.py +0 -0
- scipy/stats/tests/common_tests.py +356 -0
- scipy/stats/tests/data/_mvt.py +171 -0
- scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
- scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
- scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
- scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
- scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
- scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
- scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
- scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
- scipy/stats/tests/test_axis_nan_policy.py +1388 -0
- scipy/stats/tests/test_binned_statistic.py +568 -0
- scipy/stats/tests/test_censored_data.py +152 -0
- scipy/stats/tests/test_contingency.py +294 -0
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +2198 -0
- scipy/stats/tests/test_continuous_basic.py +1053 -0
- scipy/stats/tests/test_continuous_fit_censored.py +683 -0
- scipy/stats/tests/test_correlation.py +80 -0
- scipy/stats/tests/test_crosstab.py +115 -0
- scipy/stats/tests/test_discrete_basic.py +580 -0
- scipy/stats/tests/test_discrete_distns.py +700 -0
- scipy/stats/tests/test_distributions.py +10413 -0
- scipy/stats/tests/test_entropy.py +322 -0
- scipy/stats/tests/test_fast_gen_inversion.py +435 -0
- scipy/stats/tests/test_fit.py +1090 -0
- scipy/stats/tests/test_hypotests.py +1991 -0
- scipy/stats/tests/test_kdeoth.py +676 -0
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_mgc.py +217 -0
- scipy/stats/tests/test_morestats.py +3259 -0
- scipy/stats/tests/test_mstats_basic.py +2071 -0
- scipy/stats/tests/test_mstats_extras.py +172 -0
- scipy/stats/tests/test_multicomp.py +405 -0
- scipy/stats/tests/test_multivariate.py +4381 -0
- scipy/stats/tests/test_odds_ratio.py +148 -0
- scipy/stats/tests/test_qmc.py +1492 -0
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +345 -0
- scipy/stats/tests/test_relative_risk.py +95 -0
- scipy/stats/tests/test_resampling.py +2000 -0
- scipy/stats/tests/test_sampling.py +1450 -0
- scipy/stats/tests/test_sensitivity_analysis.py +310 -0
- scipy/stats/tests/test_stats.py +9707 -0
- scipy/stats/tests/test_survival.py +466 -0
- scipy/stats/tests/test_tukeylambda_stats.py +85 -0
- scipy/stats/tests/test_variation.py +216 -0
- scipy/version.py +12 -0
- scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
- scipy-1.16.2.dist-info/LICENSE.txt +912 -0
- scipy-1.16.2.dist-info/METADATA +1061 -0
- scipy-1.16.2.dist-info/RECORD +1530 -0
- scipy-1.16.2.dist-info/WHEEL +4 -0
- scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
- scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,1388 @@
|
|
1
|
+
# Many scipy.stats functions support `axis` and `nan_policy` parameters.
|
2
|
+
# When the two are combined, it can be tricky to get all the behavior just
|
3
|
+
# right. This file contains a suite of common tests for scipy.stats functions
|
4
|
+
# that support `axis` and `nan_policy` and additional tests for some associated
|
5
|
+
# functions in stats._util.
|
6
|
+
|
7
|
+
from itertools import product, combinations_with_replacement, permutations
|
8
|
+
import os
|
9
|
+
import re
|
10
|
+
import pickle
|
11
|
+
import pytest
|
12
|
+
import warnings
|
13
|
+
|
14
|
+
import numpy as np
|
15
|
+
from numpy.testing import assert_allclose, assert_equal
|
16
|
+
from scipy import stats
|
17
|
+
from scipy.stats import norm # type: ignore[attr-defined]
|
18
|
+
from scipy.stats._axis_nan_policy import (_masked_arrays_2_sentinel_arrays,
|
19
|
+
SmallSampleWarning,
|
20
|
+
too_small_nd_omit, too_small_nd_not_omit,
|
21
|
+
too_small_1d_omit, too_small_1d_not_omit)
|
22
|
+
from scipy._lib._util import AxisError
|
23
|
+
from scipy.conftest import skip_xp_invalid_arg
|
24
|
+
|
25
|
+
|
26
|
+
SCIPY_XSLOW = int(os.environ.get('SCIPY_XSLOW', '0'))
|
27
|
+
|
28
|
+
|
29
|
+
def unpack_ttest_result(res):
|
30
|
+
low, high = res.confidence_interval()
|
31
|
+
return (res.statistic, res.pvalue, res.df, res._standard_error,
|
32
|
+
res._estimate, low, high)
|
33
|
+
|
34
|
+
|
35
|
+
def _get_ttest_ci(ttest):
|
36
|
+
# get a function that returns the CI bounds of provided `ttest`
|
37
|
+
def ttest_ci(*args, **kwargs):
|
38
|
+
res = ttest(*args, **kwargs)
|
39
|
+
return res.confidence_interval()
|
40
|
+
return ttest_ci
|
41
|
+
|
42
|
+
|
43
|
+
def xp_mean_1samp(*args, **kwargs):
|
44
|
+
kwargs.pop('_no_deco', None)
|
45
|
+
return stats._stats_py._xp_mean(*args, **kwargs)
|
46
|
+
|
47
|
+
|
48
|
+
def xp_mean_2samp(*args, **kwargs):
|
49
|
+
kwargs.pop('_no_deco', None)
|
50
|
+
weights = args[1]
|
51
|
+
return stats._stats_py._xp_mean(args[0], *args[2:], weights=weights, **kwargs)
|
52
|
+
|
53
|
+
|
54
|
+
def xp_var(*args, **kwargs):
|
55
|
+
kwargs.pop('_no_deco', None)
|
56
|
+
return stats._stats_py._xp_var(*args, **kwargs)
|
57
|
+
|
58
|
+
|
59
|
+
def gstd(*args, **kwargs):
|
60
|
+
kwargs.pop('_no_deco', None)
|
61
|
+
return stats.gstd(*args, **kwargs)
|
62
|
+
|
63
|
+
|
64
|
+
def combine_pvalues_weighted(*args, **kwargs):
|
65
|
+
return stats.combine_pvalues(args[0], *args[2:], weights=args[1],
|
66
|
+
method='stouffer', **kwargs)
|
67
|
+
|
68
|
+
|
69
|
+
def weightedtau_weighted(x, y, rank, **kwargs):
|
70
|
+
axis = kwargs.get('axis', 0)
|
71
|
+
nan_policy = kwargs.get('nan_policy', 'propagate')
|
72
|
+
rank = stats.rankdata(rank, axis=axis, nan_policy=nan_policy)
|
73
|
+
return stats.weightedtau(x, y, rank, **kwargs)
|
74
|
+
|
75
|
+
|
76
|
+
axis_nan_policy_cases = [
|
77
|
+
# function, args, kwds, number of samples, number of outputs,
|
78
|
+
# ... paired, unpacker function
|
79
|
+
# args, kwds typically aren't needed; just showing that they work
|
80
|
+
(stats.kruskal, tuple(), dict(), 3, 2, False, None), # 4 samples is slow
|
81
|
+
(stats.ranksums, ('less',), dict(), 2, 2, False, None),
|
82
|
+
(stats.mannwhitneyu, tuple(), {'method': 'asymptotic'}, 2, 2, False, None),
|
83
|
+
(stats.wilcoxon, ('pratt',), {'mode': 'auto'}, 2, 2, True,
|
84
|
+
lambda res: (res.statistic, res.pvalue)),
|
85
|
+
(stats.wilcoxon, tuple(), dict(), 1, 2, True,
|
86
|
+
lambda res: (res.statistic, res.pvalue)),
|
87
|
+
(stats.wilcoxon, tuple(), {'method': 'asymptotic'}, 1, 3, True,
|
88
|
+
lambda res: (res.statistic, res.pvalue, res.zstatistic)),
|
89
|
+
(stats.gmean, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
90
|
+
(stats.hmean, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
91
|
+
(stats.pmean, (1.42,), dict(), 1, 1, False, lambda x: (x,)),
|
92
|
+
(stats.sem, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
93
|
+
(stats.iqr, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
94
|
+
(stats.kurtosis, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
95
|
+
(stats.skew, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
96
|
+
(stats.kstat, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
97
|
+
(stats.kstatvar, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
98
|
+
(stats.moment, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
99
|
+
(stats.moment, tuple(), dict(order=[1, 2]), 1, 2, False, None),
|
100
|
+
(stats.jarque_bera, tuple(), dict(), 1, 2, False, None),
|
101
|
+
(stats.ttest_1samp, (np.array([0]),), dict(), 1, 7, False,
|
102
|
+
unpack_ttest_result),
|
103
|
+
(stats.ttest_rel, tuple(), dict(), 2, 7, True, unpack_ttest_result),
|
104
|
+
(stats.ttest_ind, tuple(), dict(), 2, 7, False, unpack_ttest_result),
|
105
|
+
(_get_ttest_ci(stats.ttest_1samp), (0,), dict(), 1, 2, False, None),
|
106
|
+
(_get_ttest_ci(stats.ttest_rel), tuple(), dict(), 2, 2, True, None),
|
107
|
+
(_get_ttest_ci(stats.ttest_ind), tuple(), dict(), 2, 2, False, None),
|
108
|
+
(stats.mode, tuple(), dict(), 1, 2, True, lambda x: (x.mode, x.count)),
|
109
|
+
(stats.differential_entropy, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
110
|
+
(stats.variation, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
111
|
+
(stats.friedmanchisquare, tuple(), dict(), 3, 2, True, None),
|
112
|
+
(stats.brunnermunzel, tuple(), dict(distribution='normal'), 2, 2, False, None),
|
113
|
+
(stats.mood, tuple(), {}, 2, 2, False, None),
|
114
|
+
(stats.shapiro, tuple(), {}, 1, 2, False, None),
|
115
|
+
(stats.ks_1samp, (norm().cdf,), dict(), 1, 4, False,
|
116
|
+
lambda res: (*res, res.statistic_location, res.statistic_sign)),
|
117
|
+
(stats.ks_2samp, tuple(), dict(), 2, 4, False,
|
118
|
+
lambda res: (*res, res.statistic_location, res.statistic_sign)),
|
119
|
+
(stats.kstest, (norm().cdf,), dict(), 1, 4, False,
|
120
|
+
lambda res: (*res, res.statistic_location, res.statistic_sign)),
|
121
|
+
(stats.kstest, tuple(), dict(), 2, 4, False,
|
122
|
+
lambda res: (*res, res.statistic_location, res.statistic_sign)),
|
123
|
+
(stats.levene, tuple(), {}, 2, 2, False, None),
|
124
|
+
(stats.fligner, tuple(), {'center': 'trimmed', 'proportiontocut': 0.01},
|
125
|
+
2, 2, False, None),
|
126
|
+
(stats.ansari, tuple(), {}, 2, 2, False, None),
|
127
|
+
(stats.entropy, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
128
|
+
(stats.entropy, tuple(), dict(), 2, 1, True, lambda x: (x,)),
|
129
|
+
(stats.skewtest, tuple(), dict(), 1, 2, False, None),
|
130
|
+
(stats.kurtosistest, tuple(), dict(), 1, 2, False, None),
|
131
|
+
(stats.normaltest, tuple(), dict(), 1, 2, False, None),
|
132
|
+
(stats.cramervonmises, ("norm",), dict(), 1, 2, False,
|
133
|
+
lambda res: (res.statistic, res.pvalue)),
|
134
|
+
(stats.cramervonmises_2samp, tuple(), dict(), 2, 2, False,
|
135
|
+
lambda res: (res.statistic, res.pvalue)),
|
136
|
+
(stats.epps_singleton_2samp, tuple(), dict(), 2, 2, False, None),
|
137
|
+
(stats.bartlett, tuple(), {}, 2, 2, False, None),
|
138
|
+
(stats.tmean, tuple(), {}, 1, 1, False, lambda x: (x,)),
|
139
|
+
(stats.tvar, tuple(), {}, 1, 1, False, lambda x: (x,)),
|
140
|
+
(stats.tmin, tuple(), {}, 1, 1, False, lambda x: (x,)),
|
141
|
+
(stats.tmax, tuple(), {}, 1, 1, False, lambda x: (x,)),
|
142
|
+
(stats.tstd, tuple(), {}, 1, 1, False, lambda x: (x,)),
|
143
|
+
(stats.tsem, tuple(), {}, 1, 1, False, lambda x: (x,)),
|
144
|
+
(stats.circmean, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
145
|
+
(stats.circvar, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
146
|
+
(stats.circstd, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
147
|
+
(stats.f_oneway, tuple(), {}, 2, 2, False, None),
|
148
|
+
(stats.f_oneway, tuple(), {'equal_var': False}, 2, 2, False, None),
|
149
|
+
(stats.alexandergovern, tuple(), {}, 2, 2, False,
|
150
|
+
lambda res: (res.statistic, res.pvalue)),
|
151
|
+
(stats.combine_pvalues, tuple(), {}, 1, 2, False, None),
|
152
|
+
(stats.lmoment, tuple(), dict(), 1, 4, False, lambda x: tuple(x)),
|
153
|
+
(combine_pvalues_weighted, tuple(), {}, 2, 2, True, None),
|
154
|
+
(xp_mean_1samp, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
155
|
+
(xp_mean_2samp, tuple(), dict(), 2, 1, True, lambda x: (x,)),
|
156
|
+
(xp_var, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
157
|
+
(stats.chatterjeexi, tuple(), dict(), 2, 2, True,
|
158
|
+
lambda res: (res.statistic, res.pvalue)),
|
159
|
+
(stats.pointbiserialr, tuple(), dict(), 2, 3, True,
|
160
|
+
lambda res: (res.statistic, res.pvalue, res.correlation)),
|
161
|
+
(stats.kendalltau, tuple(), dict(), 2, 3, True,
|
162
|
+
lambda res: (res.statistic, res.pvalue, res.correlation)),
|
163
|
+
(stats.weightedtau, tuple(), dict(), 2, 3, True,
|
164
|
+
lambda res: (res.statistic, res.pvalue, res.correlation)),
|
165
|
+
(weightedtau_weighted, tuple(), dict(), 3, 3, True,
|
166
|
+
lambda res: (res.statistic, res.pvalue, res.correlation)),
|
167
|
+
(stats.linregress, tuple(), dict(), 2, 6, True,
|
168
|
+
lambda res: tuple(res) + (res.intercept_stderr,)),
|
169
|
+
(stats.theilslopes, tuple(), dict(), 2, 4, True, tuple),
|
170
|
+
(stats.theilslopes, tuple(), dict(), 1, 4, True, tuple),
|
171
|
+
(stats.siegelslopes, tuple(), dict(), 2, 2, True, tuple),
|
172
|
+
(stats.siegelslopes, tuple(), dict(), 1, 2, True, tuple),
|
173
|
+
(gstd, tuple(), dict(), 1, 1, False, lambda x: (x,)),
|
174
|
+
(stats.power_divergence, tuple(), dict(), 1, 2, False, None),
|
175
|
+
(stats.chisquare, tuple(), dict(), 1, 2, False, None),
|
176
|
+
(stats._morestats._boxcox_llf, tuple(), dict(lmb=1.5), 1, 1, False, lambda x: (x,)),
|
177
|
+
]
|
178
|
+
|
179
|
+
# If the message is one of those expected, put nans in
|
180
|
+
# appropriate places of `statistics` and `pvalues`
|
181
|
+
too_small_messages = {"Degrees of freedom <= 0 for slice",
|
182
|
+
"x and y should have at least 5 elements",
|
183
|
+
"Data must be at least length 3",
|
184
|
+
"The sample must contain at least two",
|
185
|
+
"x and y must contain at least two",
|
186
|
+
"division by zero",
|
187
|
+
"Mean of empty slice",
|
188
|
+
"Data passed to ks_2samp must not be empty",
|
189
|
+
"Not enough test observations",
|
190
|
+
"Not enough other observations",
|
191
|
+
"Not enough observations.",
|
192
|
+
"At least one observation is required",
|
193
|
+
"zero-size array to reduction operation maximum",
|
194
|
+
"`x` and `y` must be of nonzero size.",
|
195
|
+
"The exact distribution of the Wilcoxon test",
|
196
|
+
"Data input must not be empty",
|
197
|
+
"Window length (0) must be positive and less",
|
198
|
+
"Window length (1) must be positive and less",
|
199
|
+
"Window length (2) must be positive and less",
|
200
|
+
"`skewtest` requires at least",
|
201
|
+
"`kurtosistest` requires at least",
|
202
|
+
"attempt to get argmax of an empty sequence",
|
203
|
+
"No array values within given limits",
|
204
|
+
"Input sample size must be greater than one.",
|
205
|
+
"At least one slice along `axis` has zero length",
|
206
|
+
"One or more sample arguments is too small",
|
207
|
+
"invalid value encountered",
|
208
|
+
"divide by zero encountered",
|
209
|
+
"`x` and `y` must have length at least 2.",
|
210
|
+
"Inputs must not be empty.",
|
211
|
+
"All `x` coordinates are identical.",
|
212
|
+
}
|
213
|
+
|
214
|
+
# If the message is one of these, results of the function may be inaccurate,
|
215
|
+
# but NaNs are not to be placed
|
216
|
+
inaccuracy_messages = {"Precision loss occurred in moment calculation",
|
217
|
+
"Sample size too small for normal approximation."}
|
218
|
+
|
219
|
+
# For some functions, nan_policy='propagate' should not just return NaNs
|
220
|
+
override_propagate_funcs = {stats.mode, weightedtau_weighted, stats.weightedtau}
|
221
|
+
|
222
|
+
# For some functions, empty arrays produce non-NaN results
|
223
|
+
empty_special_case_funcs = {stats.entropy, stats.chisquare, stats.power_divergence}
|
224
|
+
|
225
|
+
# Some functions don't follow the usual "too small" warning rules
|
226
|
+
too_small_special_case_funcs = {stats.entropy, stats.chisquare, stats.power_divergence}
|
227
|
+
|
228
|
+
def _mixed_data_generator(n_samples, n_repetitions, axis, rng,
|
229
|
+
paired=False):
|
230
|
+
# generate random samples to check the response of hypothesis tests to
|
231
|
+
# samples with different (but broadcastable) shapes and various
|
232
|
+
# nan patterns (e.g. all nans, some nans, no nans) along axis-slices
|
233
|
+
|
234
|
+
data = []
|
235
|
+
for i in range(n_samples):
|
236
|
+
n_patterns = 6 # number of distinct nan patterns
|
237
|
+
n_obs = 20 if paired else 20 + i # observations per axis-slice
|
238
|
+
x = np.ones((n_repetitions, n_patterns, n_obs)) * np.nan
|
239
|
+
|
240
|
+
for j in range(n_repetitions):
|
241
|
+
samples = x[j, :, :]
|
242
|
+
|
243
|
+
# case 0: axis-slice with all nans (0 reals)
|
244
|
+
# cases 1-3: axis-slice with 1-3 reals (the rest nans)
|
245
|
+
# case 4: axis-slice with mostly (all but two) reals
|
246
|
+
# case 5: axis slice with all reals
|
247
|
+
for k, n_reals in enumerate([0, 1, 2, 3, n_obs-2, n_obs]):
|
248
|
+
# for cases 1-3, need paired nansw to be in the same place
|
249
|
+
indices = rng.permutation(n_obs)[:n_reals]
|
250
|
+
samples[k, indices] = rng.random(size=n_reals)
|
251
|
+
|
252
|
+
# permute the axis-slices just to show that order doesn't matter
|
253
|
+
samples[:] = rng.permutation(samples, axis=0)
|
254
|
+
|
255
|
+
# For multi-sample tests, we want to test broadcasting and check
|
256
|
+
# that nan policy works correctly for each nan pattern for each input.
|
257
|
+
# This takes care of both simultaneously.
|
258
|
+
new_shape = [n_repetitions] + [1]*n_samples + [n_obs]
|
259
|
+
new_shape[1 + i] = 6
|
260
|
+
x = x.reshape(new_shape)
|
261
|
+
|
262
|
+
x = np.moveaxis(x, -1, axis)
|
263
|
+
data.append(x)
|
264
|
+
return data
|
265
|
+
|
266
|
+
|
267
|
+
def _homogeneous_data_generator(n_samples, n_repetitions, axis, rng,
|
268
|
+
paired=False, all_nans=True):
|
269
|
+
# generate random samples to check the response of hypothesis tests to
|
270
|
+
# samples with different (but broadcastable) shapes and homogeneous
|
271
|
+
# data (all nans or all finite)
|
272
|
+
data = []
|
273
|
+
for i in range(n_samples):
|
274
|
+
n_obs = 20 if paired else 20 + i # observations per axis-slice
|
275
|
+
shape = [n_repetitions] + [1]*n_samples + [n_obs]
|
276
|
+
shape[1 + i] = 2
|
277
|
+
x = np.ones(shape) * np.nan if all_nans else rng.random(shape)
|
278
|
+
x = np.moveaxis(x, -1, axis)
|
279
|
+
data.append(x)
|
280
|
+
return data
|
281
|
+
|
282
|
+
|
283
|
+
def nan_policy_1d(hypotest, data1d, unpacker, *args, n_outputs=2,
|
284
|
+
nan_policy='raise', paired=False, _no_deco=True, **kwds):
|
285
|
+
# Reference implementation for how `nan_policy` should work for 1d samples
|
286
|
+
|
287
|
+
if nan_policy == 'raise':
|
288
|
+
for sample in data1d:
|
289
|
+
if np.any(np.isnan(sample)):
|
290
|
+
raise ValueError("The input contains nan values")
|
291
|
+
|
292
|
+
elif (nan_policy == 'propagate'
|
293
|
+
and hypotest not in override_propagate_funcs):
|
294
|
+
# For all hypothesis tests tested, returning nans is the right thing.
|
295
|
+
# But many hypothesis tests don't propagate correctly (e.g. they treat
|
296
|
+
# np.nan the same as np.inf, which doesn't make sense when ranks are
|
297
|
+
# involved) so override that behavior here.
|
298
|
+
for sample in data1d:
|
299
|
+
if np.any(np.isnan(sample)):
|
300
|
+
return np.full(n_outputs, np.nan)
|
301
|
+
|
302
|
+
elif nan_policy == 'omit':
|
303
|
+
# manually omit nans (or pairs in which at least one element is nan)
|
304
|
+
if not paired:
|
305
|
+
data1d = [sample[~np.isnan(sample)] for sample in data1d]
|
306
|
+
else:
|
307
|
+
nan_mask = np.isnan(data1d[0])
|
308
|
+
for sample in data1d[1:]:
|
309
|
+
nan_mask = np.logical_or(nan_mask, np.isnan(sample))
|
310
|
+
data1d = [sample[~nan_mask] for sample in data1d]
|
311
|
+
|
312
|
+
return unpacker(hypotest(*data1d, *args, _no_deco=_no_deco, **kwds))
|
313
|
+
|
314
|
+
|
315
|
+
# These three warnings are intentional
|
316
|
+
# For `wilcoxon` when the sample size < 50
|
317
|
+
@pytest.mark.filterwarnings('ignore:Sample size too small for normal:UserWarning')
|
318
|
+
# `kurtosistest` and `normaltest` when sample size < 20
|
319
|
+
@pytest.mark.filterwarnings('ignore:`kurtosistest` p-value may be:UserWarning')
|
320
|
+
# `foneway`
|
321
|
+
@pytest.mark.filterwarnings('ignore:all input arrays have length 1.:RuntimeWarning')
|
322
|
+
|
323
|
+
# The rest of these may or may not be desirable. They need further investigation
|
324
|
+
# to determine whether the function's decorator should define `too_small.
|
325
|
+
# `bartlett`, `tvar`, `tstd`, `tsem`
|
326
|
+
@pytest.mark.filterwarnings('ignore:Degrees of freedom <= 0 for slice:RuntimeWarning')
|
327
|
+
# kstat, kstatvar, ttest_1samp, ttest_rel, ttest_ind, ttest_ci, brunnermunzel
|
328
|
+
# mood, levene, fligner, bartlett
|
329
|
+
@pytest.mark.filterwarnings('ignore:Invalid value encountered in:RuntimeWarning')
|
330
|
+
# kstatvar, ttest_1samp, ttest_rel, ttest_ci, brunnermunzel, levene, bartlett
|
331
|
+
@pytest.mark.filterwarnings('ignore:divide by zero encountered:RuntimeWarning')
|
332
|
+
|
333
|
+
@pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
|
334
|
+
"paired", "unpacker"), axis_nan_policy_cases)
|
335
|
+
@pytest.mark.parametrize(("nan_policy"), ("propagate", "omit", "raise"))
|
336
|
+
@pytest.mark.parametrize(("axis"), (1,))
|
337
|
+
@pytest.mark.parametrize(("data_generator"), ("mixed",))
|
338
|
+
@pytest.mark.parallel_threads(1)
|
339
|
+
def test_axis_nan_policy_fast(hypotest, args, kwds, n_samples, n_outputs,
|
340
|
+
paired, unpacker, nan_policy, axis,
|
341
|
+
data_generator):
|
342
|
+
if hypotest in {stats.cramervonmises_2samp, stats.kruskal} and not SCIPY_XSLOW:
|
343
|
+
pytest.skip("Too slow.")
|
344
|
+
_axis_nan_policy_test(hypotest, args, kwds, n_samples, n_outputs, paired,
|
345
|
+
unpacker, nan_policy, axis, data_generator)
|
346
|
+
|
347
|
+
|
348
|
+
if SCIPY_XSLOW:
|
349
|
+
# Takes O(1 min) to run, and even skipping with the `xslow` decorator takes
|
350
|
+
# about 3 sec because this is >3,000 tests. So ensure pytest doesn't see
|
351
|
+
# them at all unless `SCIPY_XSLOW` is defined.
|
352
|
+
|
353
|
+
# These three warnings are intentional
|
354
|
+
# For `wilcoxon` when the sample size < 50
|
355
|
+
@pytest.mark.filterwarnings('ignore:Sample size too small for normal:UserWarning')
|
356
|
+
# `kurtosistest` and `normaltest` when sample size < 20
|
357
|
+
@pytest.mark.filterwarnings('ignore:`kurtosistest` p-value may be:UserWarning')
|
358
|
+
# `foneway`
|
359
|
+
@pytest.mark.filterwarnings('ignore:all input arrays have length 1.:RuntimeWarning')
|
360
|
+
|
361
|
+
# The rest of these may or may not be desirable. They need further investigation
|
362
|
+
# to determine whether the function's decorator should define `too_small.
|
363
|
+
# `bartlett`, `tvar`, `tstd`, `tsem`
|
364
|
+
@pytest.mark.filterwarnings('ignore:Degrees of freedom <= 0 for:RuntimeWarning')
|
365
|
+
# kstat, kstatvar, ttest_1samp, ttest_rel, ttest_ind, ttest_ci, brunnermunzel
|
366
|
+
# mood, levene, fligner, bartlett
|
367
|
+
@pytest.mark.filterwarnings('ignore:Invalid value encountered in:RuntimeWarning')
|
368
|
+
# kstatvar, ttest_1samp, ttest_rel, ttest_ci, brunnermunzel, levene, bartlett
|
369
|
+
@pytest.mark.filterwarnings('ignore:divide by zero encountered:RuntimeWarning')
|
370
|
+
|
371
|
+
@pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
|
372
|
+
"paired", "unpacker"), axis_nan_policy_cases)
|
373
|
+
@pytest.mark.parametrize(("nan_policy"), ("propagate", "omit", "raise"))
|
374
|
+
@pytest.mark.parametrize(("axis"), range(-3, 3))
|
375
|
+
@pytest.mark.parametrize(("data_generator"),
|
376
|
+
("all_nans", "all_finite", "mixed"))
|
377
|
+
def test_axis_nan_policy_full(hypotest, args, kwds, n_samples, n_outputs,
|
378
|
+
paired, unpacker, nan_policy, axis,
|
379
|
+
data_generator):
|
380
|
+
_axis_nan_policy_test(hypotest, args, kwds, n_samples, n_outputs, paired,
|
381
|
+
unpacker, nan_policy, axis, data_generator)
|
382
|
+
|
383
|
+
|
384
|
+
def _axis_nan_policy_test(hypotest, args, kwds, n_samples, n_outputs, paired,
|
385
|
+
unpacker, nan_policy, axis, data_generator):
|
386
|
+
# Tests the 1D and vectorized behavior of hypothesis tests against a
|
387
|
+
# reference implementation (nan_policy_1d with np.ndenumerate)
|
388
|
+
|
389
|
+
# Some hypothesis tests return a non-iterable that needs an `unpacker` to
|
390
|
+
# extract the statistic and p-value. For those that don't:
|
391
|
+
if not unpacker:
|
392
|
+
def unpacker(res):
|
393
|
+
return res
|
394
|
+
|
395
|
+
rng = np.random.default_rng(0)
|
396
|
+
|
397
|
+
# Generate multi-dimensional test data with all important combinations
|
398
|
+
# of patterns of nans along `axis`
|
399
|
+
n_repetitions = 3 # number of repetitions of each pattern
|
400
|
+
data_gen_kwds = {'n_samples': n_samples, 'n_repetitions': n_repetitions,
|
401
|
+
'axis': axis, 'rng': rng, 'paired': paired}
|
402
|
+
if data_generator == 'mixed':
|
403
|
+
inherent_size = 6 # number of distinct types of patterns
|
404
|
+
data = _mixed_data_generator(**data_gen_kwds)
|
405
|
+
elif data_generator == 'all_nans':
|
406
|
+
inherent_size = 2 # hard-coded in _homogeneous_data_generator
|
407
|
+
data_gen_kwds['all_nans'] = True
|
408
|
+
data = _homogeneous_data_generator(**data_gen_kwds)
|
409
|
+
elif data_generator == 'all_finite':
|
410
|
+
inherent_size = 2 # hard-coded in _homogeneous_data_generator
|
411
|
+
data_gen_kwds['all_nans'] = False
|
412
|
+
data = _homogeneous_data_generator(**data_gen_kwds)
|
413
|
+
|
414
|
+
output_shape = [n_repetitions] + [inherent_size]*n_samples
|
415
|
+
|
416
|
+
# To generate reference behavior to compare against, loop over the axis-
|
417
|
+
# slices in data. Make indexing easier by moving `axis` to the end and
|
418
|
+
# broadcasting all samples to the same shape.
|
419
|
+
data_b = [np.moveaxis(sample, axis, -1) for sample in data]
|
420
|
+
data_b = [np.broadcast_to(sample, output_shape + [sample.shape[-1]])
|
421
|
+
for sample in data_b]
|
422
|
+
res_1d = np.zeros(output_shape + [n_outputs])
|
423
|
+
|
424
|
+
for i, _ in np.ndenumerate(np.zeros(output_shape)):
|
425
|
+
data1d = [sample[i] for sample in data_b]
|
426
|
+
contains_nan = any([np.isnan(sample).any() for sample in data1d])
|
427
|
+
|
428
|
+
# Take care of `nan_policy='raise'`.
|
429
|
+
# Afterward, the 1D part of the test is over
|
430
|
+
message = "The input contains nan values"
|
431
|
+
if nan_policy == 'raise' and contains_nan:
|
432
|
+
with pytest.raises(ValueError, match=message):
|
433
|
+
nan_policy_1d(hypotest, data1d, unpacker, *args,
|
434
|
+
n_outputs=n_outputs,
|
435
|
+
nan_policy=nan_policy,
|
436
|
+
paired=paired, _no_deco=True, **kwds)
|
437
|
+
|
438
|
+
with pytest.raises(ValueError, match=message):
|
439
|
+
hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
|
440
|
+
|
441
|
+
continue
|
442
|
+
|
443
|
+
# Take care of `nan_policy='propagate'` and `nan_policy='omit'`
|
444
|
+
|
445
|
+
# Get results of simple reference implementation
|
446
|
+
try:
|
447
|
+
res_1da = nan_policy_1d(hypotest, data1d, unpacker, *args,
|
448
|
+
n_outputs=n_outputs,
|
449
|
+
nan_policy=nan_policy,
|
450
|
+
paired=paired, _no_deco=True, **kwds)
|
451
|
+
except (ValueError, RuntimeWarning, ZeroDivisionError, UserWarning) as ea:
|
452
|
+
ea_str = str(ea)
|
453
|
+
if any([str(ea_str).startswith(msg) for msg in too_small_messages]):
|
454
|
+
res_1da = np.full(n_outputs, np.nan)
|
455
|
+
else:
|
456
|
+
raise
|
457
|
+
|
458
|
+
# Get results of public function with 1D slices
|
459
|
+
# Should warn for all slices
|
460
|
+
if (nan_policy == 'omit' and data_generator == "all_nans"
|
461
|
+
and hypotest not in too_small_special_case_funcs):
|
462
|
+
with pytest.warns(SmallSampleWarning, match=too_small_1d_omit):
|
463
|
+
res = hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
|
464
|
+
# warning depends on slice
|
465
|
+
elif (nan_policy == 'omit' and data_generator == "mixed"
|
466
|
+
and hypotest not in too_small_special_case_funcs):
|
467
|
+
with np.testing.suppress_warnings() as sup:
|
468
|
+
sup.filter(SmallSampleWarning, too_small_1d_omit)
|
469
|
+
res = hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
|
470
|
+
# shouldn't complain if there are no NaNs
|
471
|
+
else:
|
472
|
+
res = hypotest(*data1d, *args, nan_policy=nan_policy, **kwds)
|
473
|
+
res_1db = unpacker(res)
|
474
|
+
|
475
|
+
assert_allclose(res_1db, res_1da, rtol=1e-15)
|
476
|
+
res_1d[i] = res_1db
|
477
|
+
|
478
|
+
res_1d = np.moveaxis(res_1d, -1, 0)
|
479
|
+
|
480
|
+
# Perform a vectorized call to the hypothesis test.
|
481
|
+
|
482
|
+
# If `nan_policy == 'raise'`, check that it raises the appropriate error.
|
483
|
+
# Test is done, so return
|
484
|
+
if nan_policy == 'raise' and not data_generator == "all_finite":
|
485
|
+
message = 'The input contains nan values'
|
486
|
+
with pytest.raises(ValueError, match=message):
|
487
|
+
hypotest(*data, axis=axis, nan_policy=nan_policy, *args, **kwds)
|
488
|
+
return
|
489
|
+
|
490
|
+
# If `nan_policy == 'omit', we might be left with a small sample.
|
491
|
+
# Check for the appropriate warning.
|
492
|
+
if (nan_policy == 'omit' and data_generator in {"all_nans", "mixed"}
|
493
|
+
and hypotest not in too_small_special_case_funcs):
|
494
|
+
with pytest.warns(SmallSampleWarning, match=too_small_nd_omit):
|
495
|
+
res = hypotest(*data, axis=axis, nan_policy=nan_policy, *args, **kwds)
|
496
|
+
else: # otherwise, there should be no warning
|
497
|
+
res = hypotest(*data, axis=axis, nan_policy=nan_policy, *args, **kwds)
|
498
|
+
|
499
|
+
# Compare against the output against looping over 1D slices
|
500
|
+
res_nd = unpacker(res)
|
501
|
+
|
502
|
+
assert_allclose(res_nd, res_1d, rtol=1e-14)
|
503
|
+
|
504
|
+
|
505
|
+
@pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
|
506
|
+
"paired", "unpacker"), axis_nan_policy_cases)
|
507
|
+
@pytest.mark.parametrize(("nan_policy"), ("propagate", "omit", "raise"))
|
508
|
+
@pytest.mark.parametrize(("data_generator"),
|
509
|
+
("all_nans", "all_finite", "mixed", "empty"))
|
510
|
+
@pytest.mark.parallel_threads(1)
|
511
|
+
def test_axis_nan_policy_axis_is_None(hypotest, args, kwds, n_samples,
|
512
|
+
n_outputs, paired, unpacker, nan_policy,
|
513
|
+
data_generator):
|
514
|
+
# check for correct behavior when `axis=None`
|
515
|
+
if not unpacker:
|
516
|
+
def unpacker(res):
|
517
|
+
return res
|
518
|
+
|
519
|
+
rng = np.random.default_rng(0)
|
520
|
+
|
521
|
+
if data_generator == "empty":
|
522
|
+
data = [rng.random((2, 0)) for i in range(n_samples)]
|
523
|
+
else:
|
524
|
+
data = [rng.random((2, 20)) for i in range(n_samples)]
|
525
|
+
|
526
|
+
if data_generator == "mixed":
|
527
|
+
masks = [rng.random((2, 20)) > 0.9 for i in range(n_samples)]
|
528
|
+
for sample, mask in zip(data, masks):
|
529
|
+
sample[mask] = np.nan
|
530
|
+
elif data_generator == "all_nans":
|
531
|
+
data = [sample * np.nan for sample in data]
|
532
|
+
|
533
|
+
data_raveled = [sample.ravel() for sample in data]
|
534
|
+
|
535
|
+
if nan_policy == 'raise' and data_generator not in {"all_finite", "empty"}:
|
536
|
+
message = 'The input contains nan values'
|
537
|
+
|
538
|
+
# check for correct behavior whether or not data is 1d to begin with
|
539
|
+
with pytest.raises(ValueError, match=message):
|
540
|
+
hypotest(*data, axis=None, nan_policy=nan_policy,
|
541
|
+
*args, **kwds)
|
542
|
+
with pytest.raises(ValueError, match=message):
|
543
|
+
hypotest(*data_raveled, axis=None, nan_policy=nan_policy,
|
544
|
+
*args, **kwds)
|
545
|
+
|
546
|
+
return
|
547
|
+
|
548
|
+
# behavior of reference implementation with 1d input, public function with 1d
|
549
|
+
# input, and public function with Nd input and `axis=None` should be consistent.
|
550
|
+
# This means:
|
551
|
+
# - If the reference version raises an error or emits a warning, it's because
|
552
|
+
# the sample is too small, so check that the public function emits an
|
553
|
+
# appropriate "too small" warning
|
554
|
+
# - Any results returned by the three versions should be the same.
|
555
|
+
with warnings.catch_warnings(): # treat warnings as errors
|
556
|
+
warnings.simplefilter("error")
|
557
|
+
|
558
|
+
ea_str, eb_str, ec_str = None, None, None
|
559
|
+
try:
|
560
|
+
res1da = nan_policy_1d(hypotest, data_raveled, unpacker, *args,
|
561
|
+
n_outputs=n_outputs, nan_policy=nan_policy,
|
562
|
+
paired=paired, _no_deco=True, **kwds)
|
563
|
+
except (RuntimeWarning, ValueError, ZeroDivisionError, UserWarning) as ea:
|
564
|
+
res1da = None
|
565
|
+
ea_str = str(ea)
|
566
|
+
|
567
|
+
try:
|
568
|
+
res1db = hypotest(*data_raveled, *args, nan_policy=nan_policy, **kwds)
|
569
|
+
except SmallSampleWarning as eb:
|
570
|
+
eb_str = str(eb)
|
571
|
+
|
572
|
+
try:
|
573
|
+
res1dc = hypotest(*data, *args, axis=None, nan_policy=nan_policy, **kwds)
|
574
|
+
except SmallSampleWarning as ec:
|
575
|
+
ec_str = str(ec)
|
576
|
+
|
577
|
+
if ea_str or eb_str or ec_str: # *if* there is some sort of error or warning
|
578
|
+
# If the reference implemented generated an error or warning, make sure the
|
579
|
+
# message was one of the expected "too small" messages. Note that some
|
580
|
+
# functions don't complain at all without the decorator; that's OK, too.
|
581
|
+
ok_msg = any([str(ea_str).startswith(msg) for msg in too_small_messages])
|
582
|
+
assert (ea_str is None) or ok_msg
|
583
|
+
|
584
|
+
# make sure the wrapped function emits the *intended* warning
|
585
|
+
desired_warnings = {too_small_1d_omit, too_small_1d_not_omit}
|
586
|
+
assert str(eb_str) in desired_warnings
|
587
|
+
assert str(ec_str) in desired_warnings
|
588
|
+
|
589
|
+
with warnings.catch_warnings(): # ignore warnings to get return value
|
590
|
+
warnings.simplefilter("ignore")
|
591
|
+
res1db = hypotest(*data_raveled, *args, nan_policy=nan_policy, **kwds)
|
592
|
+
res1dc = hypotest(*data, *args, axis=None, nan_policy=nan_policy, **kwds)
|
593
|
+
|
594
|
+
# Make sure any results returned by reference/public function are identical
|
595
|
+
# and all attributes are *NumPy* scalars
|
596
|
+
res1db, res1dc = unpacker(res1db), unpacker(res1dc)
|
597
|
+
assert_equal(res1dc, res1db)
|
598
|
+
all_results = list(res1db) + list(res1dc)
|
599
|
+
|
600
|
+
if res1da is not None:
|
601
|
+
assert_allclose(res1db, res1da, rtol=1e-15)
|
602
|
+
all_results += list(res1da)
|
603
|
+
|
604
|
+
for item in all_results:
|
605
|
+
assert np.issubdtype(item.dtype, np.number)
|
606
|
+
assert np.isscalar(item)
|
607
|
+
|
608
|
+
|
609
|
+
# Test keepdims for:
|
610
|
+
# - Axis negative, positive, None, and tuple
|
611
|
+
# - 1D with no NaNs
|
612
|
+
# - 1D with NaN propagation
|
613
|
+
# - Zero-sized output
|
614
|
+
# We're working on making `stats` quieter, but that's not what this test
|
615
|
+
# is about. For now, we expect all sorts of warnings here due to small samples.
|
616
|
+
@pytest.mark.filterwarnings('ignore::UserWarning')
|
617
|
+
@pytest.mark.filterwarnings('ignore::RuntimeWarning')
|
618
|
+
@pytest.mark.parametrize("nan_policy", ("omit", "propagate"))
|
619
|
+
@pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
|
620
|
+
"paired", "unpacker"), axis_nan_policy_cases)
|
621
|
+
@pytest.mark.parametrize(
|
622
|
+
("sample_shape", "axis_cases"),
|
623
|
+
(((2, 3, 3, 4), (None, 0, -1, (0, 2), (1, -1), (3, 1, 2, 0))),
|
624
|
+
((10, ), (0, -1)),
|
625
|
+
((20, 0), (0, 1)))
|
626
|
+
)
|
627
|
+
def test_keepdims(hypotest, args, kwds, n_samples, n_outputs, paired, unpacker,
|
628
|
+
sample_shape, axis_cases, nan_policy):
|
629
|
+
small_sample_raises = {stats.skewtest, stats.kurtosistest, stats.normaltest,
|
630
|
+
stats.differential_entropy}
|
631
|
+
if sample_shape == (2, 3, 3, 4) and hypotest in small_sample_raises:
|
632
|
+
pytest.skip("Sample too small; test raises error.")
|
633
|
+
if hypotest in {weightedtau_weighted}:
|
634
|
+
pytest.skip("`rankdata` used in testing doesn't support axis tuple.")
|
635
|
+
# test if keepdims parameter works correctly
|
636
|
+
if not unpacker:
|
637
|
+
def unpacker(res):
|
638
|
+
return res
|
639
|
+
rng = np.random.default_rng(0)
|
640
|
+
data = [rng.random(sample_shape) for _ in range(n_samples)]
|
641
|
+
nan_data = [sample.copy() for sample in data]
|
642
|
+
nan_mask = [rng.random(sample_shape) < 0.2 for _ in range(n_samples)]
|
643
|
+
for sample, mask in zip(nan_data, nan_mask):
|
644
|
+
sample[mask] = np.nan
|
645
|
+
for axis in axis_cases:
|
646
|
+
expected_shape = list(sample_shape)
|
647
|
+
if axis is None:
|
648
|
+
expected_shape = np.ones(len(sample_shape))
|
649
|
+
else:
|
650
|
+
if isinstance(axis, int):
|
651
|
+
expected_shape[axis] = 1
|
652
|
+
else:
|
653
|
+
for ax in axis:
|
654
|
+
expected_shape[ax] = 1
|
655
|
+
expected_shape = tuple(expected_shape)
|
656
|
+
res = unpacker(hypotest(*data, *args, axis=axis, keepdims=True,
|
657
|
+
**kwds))
|
658
|
+
res_base = unpacker(hypotest(*data, *args, axis=axis, keepdims=False,
|
659
|
+
**kwds))
|
660
|
+
nan_res = unpacker(hypotest(*nan_data, *args, axis=axis,
|
661
|
+
keepdims=True, nan_policy=nan_policy,
|
662
|
+
**kwds))
|
663
|
+
nan_res_base = unpacker(hypotest(*nan_data, *args, axis=axis,
|
664
|
+
keepdims=False,
|
665
|
+
nan_policy=nan_policy, **kwds))
|
666
|
+
for r, r_base, rn, rn_base in zip(res, res_base, nan_res,
|
667
|
+
nan_res_base):
|
668
|
+
assert r.shape == expected_shape
|
669
|
+
r = np.squeeze(r, axis=axis)
|
670
|
+
assert_allclose(r, r_base, atol=1e-16)
|
671
|
+
assert rn.shape == expected_shape
|
672
|
+
rn = np.squeeze(rn, axis=axis)
|
673
|
+
# ideally assert_equal, but `combine_pvalues` failed on 32-bit build
|
674
|
+
assert_allclose(rn, rn_base, atol=1e-16)
|
675
|
+
|
676
|
+
|
677
|
+
@pytest.mark.parametrize(("fun", "nsamp"),
|
678
|
+
[(stats.kstat, 1),
|
679
|
+
(stats.kstatvar, 1)])
|
680
|
+
def test_hypotest_back_compat_no_axis(fun, nsamp):
|
681
|
+
m, n = 8, 9
|
682
|
+
|
683
|
+
rng = np.random.default_rng(0)
|
684
|
+
x = rng.random((nsamp, m, n))
|
685
|
+
res = fun(*x)
|
686
|
+
res2 = fun(*x, _no_deco=True)
|
687
|
+
res3 = fun([xi.ravel() for xi in x])
|
688
|
+
assert_equal(res, res2)
|
689
|
+
assert_equal(res, res3)
|
690
|
+
|
691
|
+
|
692
|
+
@pytest.mark.parametrize(("axis"), (0, 1, 2))
|
693
|
+
def test_axis_nan_policy_decorated_positional_axis(axis):
|
694
|
+
# Test for correct behavior of function decorated with
|
695
|
+
# _axis_nan_policy_decorator whether `axis` is provided as positional or
|
696
|
+
# keyword argument
|
697
|
+
|
698
|
+
shape = (8, 9, 10)
|
699
|
+
rng = np.random.default_rng(0)
|
700
|
+
x = rng.random(shape)
|
701
|
+
y = rng.random(shape)
|
702
|
+
res1 = stats.mannwhitneyu(x, y, True, 'two-sided', axis)
|
703
|
+
res2 = stats.mannwhitneyu(x, y, True, 'two-sided', axis=axis)
|
704
|
+
assert_equal(res1, res2)
|
705
|
+
|
706
|
+
message = "mannwhitneyu() got multiple values for argument 'axis'"
|
707
|
+
with pytest.raises(TypeError, match=re.escape(message)):
|
708
|
+
stats.mannwhitneyu(x, y, True, 'two-sided', axis, axis=axis)
|
709
|
+
|
710
|
+
|
711
|
+
def test_axis_nan_policy_decorated_positional_args():
|
712
|
+
# Test for correct behavior of function decorated with
|
713
|
+
# _axis_nan_policy_decorator when function accepts *args
|
714
|
+
|
715
|
+
shape = (3, 8, 9, 10)
|
716
|
+
rng = np.random.default_rng(0)
|
717
|
+
x = rng.random(shape)
|
718
|
+
x[0, 0, 0, 0] = np.nan
|
719
|
+
stats.kruskal(*x)
|
720
|
+
|
721
|
+
message = "kruskal() got an unexpected keyword argument 'samples'"
|
722
|
+
with pytest.raises(TypeError, match=re.escape(message)):
|
723
|
+
stats.kruskal(samples=x)
|
724
|
+
|
725
|
+
with pytest.raises(TypeError, match=re.escape(message)):
|
726
|
+
stats.kruskal(*x, samples=x)
|
727
|
+
|
728
|
+
|
729
|
+
def test_axis_nan_policy_decorated_keyword_samples():
|
730
|
+
# Test for correct behavior of function decorated with
|
731
|
+
# _axis_nan_policy_decorator whether samples are provided as positional or
|
732
|
+
# keyword arguments
|
733
|
+
|
734
|
+
shape = (2, 8, 9, 10)
|
735
|
+
rng = np.random.default_rng(0)
|
736
|
+
x = rng.random(shape)
|
737
|
+
x[0, 0, 0, 0] = np.nan
|
738
|
+
res1 = stats.mannwhitneyu(*x)
|
739
|
+
res2 = stats.mannwhitneyu(x=x[0], y=x[1])
|
740
|
+
assert_equal(res1, res2)
|
741
|
+
|
742
|
+
message = "mannwhitneyu() got multiple values for argument"
|
743
|
+
with pytest.raises(TypeError, match=re.escape(message)):
|
744
|
+
stats.mannwhitneyu(*x, x=x[0], y=x[1])
|
745
|
+
|
746
|
+
|
747
|
+
@pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
|
748
|
+
"paired", "unpacker"), axis_nan_policy_cases)
|
749
|
+
def test_axis_nan_policy_decorated_pickled(hypotest, args, kwds, n_samples,
|
750
|
+
n_outputs, paired, unpacker):
|
751
|
+
if "ttest_ci" in hypotest.__name__:
|
752
|
+
pytest.skip("Can't pickle functions defined within functions.")
|
753
|
+
|
754
|
+
rng = np.random.default_rng(0)
|
755
|
+
|
756
|
+
# Some hypothesis tests return a non-iterable that needs an `unpacker` to
|
757
|
+
# extract the statistic and p-value. For those that don't:
|
758
|
+
if not unpacker:
|
759
|
+
def unpacker(res):
|
760
|
+
return res
|
761
|
+
|
762
|
+
data = rng.uniform(size=(n_samples, 2, 30))
|
763
|
+
pickled_hypotest = pickle.dumps(hypotest)
|
764
|
+
unpickled_hypotest = pickle.loads(pickled_hypotest)
|
765
|
+
res1 = unpacker(hypotest(*data, *args, axis=-1, **kwds))
|
766
|
+
res2 = unpacker(unpickled_hypotest(*data, *args, axis=-1, **kwds))
|
767
|
+
assert_allclose(res1, res2, rtol=1e-12)
|
768
|
+
|
769
|
+
|
770
|
+
def test_check_empty_inputs():
|
771
|
+
# Test that _check_empty_inputs is doing its job, at least for single-
|
772
|
+
# sample inputs. (Multi-sample functionality is tested below.)
|
773
|
+
# If the input sample is not empty, it should return None.
|
774
|
+
# If the input sample is empty, it should return an array of NaNs or an
|
775
|
+
# empty array of appropriate shape. np.mean is used as a reference for the
|
776
|
+
# output because, like the statistics calculated by these functions,
|
777
|
+
# it works along and "consumes" `axis` but preserves the other axes.
|
778
|
+
for i in range(5):
|
779
|
+
for combo in combinations_with_replacement([0, 1, 2], i):
|
780
|
+
for axis in range(len(combo)):
|
781
|
+
samples = (np.zeros(combo),)
|
782
|
+
output = stats._axis_nan_policy._check_empty_inputs(samples,
|
783
|
+
axis)
|
784
|
+
if output is not None:
|
785
|
+
with np.testing.suppress_warnings() as sup:
|
786
|
+
sup.filter(RuntimeWarning, "Mean of empty slice.")
|
787
|
+
sup.filter(RuntimeWarning, "invalid value encountered")
|
788
|
+
reference = samples[0].mean(axis=axis)
|
789
|
+
np.testing.assert_equal(output, reference)
|
790
|
+
|
791
|
+
|
792
|
+
def _check_arrays_broadcastable(arrays, axis):
|
793
|
+
# https://numpy.org/doc/stable/user/basics.broadcasting.html
|
794
|
+
# "When operating on two arrays, NumPy compares their shapes element-wise.
|
795
|
+
# It starts with the trailing (i.e. rightmost) dimensions and works its
|
796
|
+
# way left.
|
797
|
+
# Two dimensions are compatible when
|
798
|
+
# 1. they are equal, or
|
799
|
+
# 2. one of them is 1
|
800
|
+
# ...
|
801
|
+
# Arrays do not need to have the same number of dimensions."
|
802
|
+
# (Clarification: if the arrays are compatible according to the criteria
|
803
|
+
# above and an array runs out of dimensions, it is still compatible.)
|
804
|
+
# Below, we follow the rules above except ignoring `axis`
|
805
|
+
|
806
|
+
n_dims = max([arr.ndim for arr in arrays])
|
807
|
+
if axis is not None:
|
808
|
+
# convert to negative axis
|
809
|
+
axis = (-n_dims + axis) if axis >= 0 else axis
|
810
|
+
|
811
|
+
for dim in range(1, n_dims+1): # we'll index from -1 to -n_dims, inclusive
|
812
|
+
if -dim == axis:
|
813
|
+
continue # ignore lengths along `axis`
|
814
|
+
|
815
|
+
dim_lengths = set()
|
816
|
+
for arr in arrays:
|
817
|
+
if dim <= arr.ndim and arr.shape[-dim] != 1:
|
818
|
+
dim_lengths.add(arr.shape[-dim])
|
819
|
+
|
820
|
+
if len(dim_lengths) > 1:
|
821
|
+
return False
|
822
|
+
return True
|
823
|
+
|
824
|
+
|
825
|
+
@pytest.mark.slow
|
826
|
+
@pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
|
827
|
+
"paired", "unpacker"), axis_nan_policy_cases)
|
828
|
+
@pytest.mark.parallel_threads(1)
|
829
|
+
def test_empty(hypotest, args, kwds, n_samples, n_outputs, paired, unpacker):
|
830
|
+
# test for correct output shape when at least one input is empty
|
831
|
+
if hypotest in {stats.kruskal, stats.friedmanchisquare} and not SCIPY_XSLOW:
|
832
|
+
pytest.skip("Too slow.")
|
833
|
+
|
834
|
+
if hypotest in override_propagate_funcs:
|
835
|
+
reason = "Doesn't follow the usual pattern. Tested separately."
|
836
|
+
pytest.skip(reason=reason)
|
837
|
+
|
838
|
+
if unpacker is None:
|
839
|
+
unpacker = lambda res: (res[0], res[1]) # noqa: E731
|
840
|
+
|
841
|
+
def small_data_generator(n_samples, n_dims):
|
842
|
+
|
843
|
+
def small_sample_generator(n_dims):
|
844
|
+
# return all possible "small" arrays in up to n_dim dimensions
|
845
|
+
for i in n_dims:
|
846
|
+
# "small" means with size along dimension either 0 or 1
|
847
|
+
for combo in combinations_with_replacement([0, 1, 2], i):
|
848
|
+
yield np.zeros(combo)
|
849
|
+
|
850
|
+
# yield all possible combinations of small samples
|
851
|
+
gens = [small_sample_generator(n_dims) for i in range(n_samples)]
|
852
|
+
yield from product(*gens)
|
853
|
+
|
854
|
+
n_dims = [1, 2, 3]
|
855
|
+
for samples in small_data_generator(n_samples, n_dims):
|
856
|
+
|
857
|
+
# this test is only for arrays of zero size
|
858
|
+
if not any(sample.size == 0 for sample in samples):
|
859
|
+
continue
|
860
|
+
|
861
|
+
max_axis = max(sample.ndim for sample in samples)
|
862
|
+
|
863
|
+
# need to test for all valid values of `axis` parameter, too
|
864
|
+
for axis in range(-max_axis, max_axis):
|
865
|
+
|
866
|
+
try:
|
867
|
+
# After broadcasting, all arrays are the same shape, so
|
868
|
+
# the shape of the output should be the same as a single-
|
869
|
+
# sample statistic. Use np.mean as a reference.
|
870
|
+
concat = stats._stats_py._broadcast_concatenate(samples, axis,
|
871
|
+
paired=paired)
|
872
|
+
with np.testing.suppress_warnings() as sup:
|
873
|
+
sup.filter(RuntimeWarning, "Mean of empty slice.")
|
874
|
+
sup.filter(RuntimeWarning, "invalid value encountered")
|
875
|
+
expected = np.mean(concat, axis=axis) * np.nan
|
876
|
+
mask = np.isnan(expected)
|
877
|
+
expected = [np.asarray(expected.copy()) for i in range(n_outputs)]
|
878
|
+
|
879
|
+
if hypotest in empty_special_case_funcs:
|
880
|
+
empty_val = hypotest(*([[]]*len(samples)), *args, **kwds)
|
881
|
+
empty_val = list(unpacker(empty_val))
|
882
|
+
for i in range(n_outputs):
|
883
|
+
expected[i][mask] = empty_val[i]
|
884
|
+
|
885
|
+
if expected[0].size and hypotest not in too_small_special_case_funcs:
|
886
|
+
message = (too_small_1d_not_omit if max_axis == 1
|
887
|
+
else too_small_nd_not_omit)
|
888
|
+
with pytest.warns(SmallSampleWarning, match=message):
|
889
|
+
res = hypotest(*samples, *args, axis=axis, **kwds)
|
890
|
+
else:
|
891
|
+
with np.testing.suppress_warnings() as sup:
|
892
|
+
# f_oneway special case
|
893
|
+
sup.filter(SmallSampleWarning, "all input arrays have length 1")
|
894
|
+
res = hypotest(*samples, *args, axis=axis, **kwds)
|
895
|
+
res = unpacker(res)
|
896
|
+
|
897
|
+
for i in range(n_outputs):
|
898
|
+
assert_equal(res[i], expected[i])
|
899
|
+
|
900
|
+
except ValueError:
|
901
|
+
# confirm that the arrays truly are not broadcastable
|
902
|
+
assert not _check_arrays_broadcastable(samples,
|
903
|
+
None if paired else axis)
|
904
|
+
|
905
|
+
# confirm that _both_ `_broadcast_concatenate` and `hypotest`
|
906
|
+
# produce this information.
|
907
|
+
message = "Array shapes are incompatible for broadcasting."
|
908
|
+
with pytest.raises(ValueError, match=message):
|
909
|
+
stats._stats_py._broadcast_concatenate(samples, axis, paired)
|
910
|
+
with pytest.raises(ValueError, match=message):
|
911
|
+
hypotest(*samples, *args, axis=axis, **kwds)
|
912
|
+
|
913
|
+
|
914
|
+
def paired_non_broadcastable_cases():
|
915
|
+
for case in axis_nan_policy_cases:
|
916
|
+
hypotest, args, kwds, n_samples, n_outputs, paired, unpacker = case
|
917
|
+
if n_samples == 1: # broadcasting only needed with >1 sample
|
918
|
+
continue
|
919
|
+
yield case
|
920
|
+
|
921
|
+
|
922
|
+
@pytest.mark.parametrize("axis", [0, 1])
|
923
|
+
@pytest.mark.parametrize(("hypotest", "args", "kwds", "n_samples", "n_outputs",
|
924
|
+
"paired", "unpacker"),
|
925
|
+
paired_non_broadcastable_cases())
|
926
|
+
def test_non_broadcastable(hypotest, args, kwds, n_samples, n_outputs, paired,
|
927
|
+
unpacker, axis):
|
928
|
+
# test for correct error message when shapes are not broadcastable
|
929
|
+
rng = np.random.default_rng(91359824598245)
|
930
|
+
get_samples = True
|
931
|
+
while get_samples:
|
932
|
+
samples = [rng.random(size=rng.integers(2, 100, size=2))
|
933
|
+
for i in range(n_samples)]
|
934
|
+
# if samples are broadcastable, try again
|
935
|
+
get_samples = _check_arrays_broadcastable(samples, axis=axis)
|
936
|
+
|
937
|
+
message = "Array shapes are incompatible for broadcasting."
|
938
|
+
with pytest.raises(ValueError, match=message):
|
939
|
+
hypotest(*samples, *args, **kwds)
|
940
|
+
|
941
|
+
if not paired: # there's another test for paired-sample statistics
|
942
|
+
return
|
943
|
+
|
944
|
+
# Previously, paired sample statistics did not raise an error
|
945
|
+
# message when the shapes were broadcastable except along `axis`
|
946
|
+
# https://github.com/scipy/scipy/pull/19578#pullrequestreview-1766857165
|
947
|
+
shape = rng.integers(2, 10, size=2)
|
948
|
+
most_samples = [rng.random(size=shape) for i in range(n_samples-1)]
|
949
|
+
shape = list(shape)
|
950
|
+
shape[axis] += 1
|
951
|
+
other_sample = rng.random(size=shape)
|
952
|
+
with pytest.raises(ValueError, match=message):
|
953
|
+
hypotest(other_sample, *most_samples, *args, **kwds)
|
954
|
+
|
955
|
+
def test_masked_array_2_sentinel_array():
|
956
|
+
# prepare arrays
|
957
|
+
np.random.seed(0)
|
958
|
+
A = np.random.rand(10, 11, 12)
|
959
|
+
B = np.random.rand(12)
|
960
|
+
mask = A < 0.5
|
961
|
+
A = np.ma.masked_array(A, mask)
|
962
|
+
|
963
|
+
# set arbitrary elements to special values
|
964
|
+
# (these values might have been considered for use as sentinel values)
|
965
|
+
max_float = np.finfo(np.float64).max
|
966
|
+
max_float2 = np.nextafter(max_float, -np.inf)
|
967
|
+
max_float3 = np.nextafter(max_float2, -np.inf)
|
968
|
+
A[3, 4, 1] = np.nan
|
969
|
+
A[4, 5, 2] = np.inf
|
970
|
+
A[5, 6, 3] = max_float
|
971
|
+
B[8] = np.nan
|
972
|
+
B[7] = np.inf
|
973
|
+
B[6] = max_float2
|
974
|
+
|
975
|
+
# convert masked A to array with sentinel value, don't modify B
|
976
|
+
out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([A, B])
|
977
|
+
A_out, B_out = out_arrays
|
978
|
+
|
979
|
+
# check that good sentinel value was chosen (according to intended logic)
|
980
|
+
assert (sentinel != max_float) and (sentinel != max_float2)
|
981
|
+
assert sentinel == max_float3
|
982
|
+
|
983
|
+
# check that output arrays are as intended
|
984
|
+
A_reference = A.data
|
985
|
+
A_reference[A.mask] = sentinel
|
986
|
+
np.testing.assert_array_equal(A_out, A_reference)
|
987
|
+
assert B_out is B
|
988
|
+
|
989
|
+
|
990
|
+
@skip_xp_invalid_arg
|
991
|
+
def test_masked_dtype():
|
992
|
+
# When _masked_arrays_2_sentinel_arrays was first added, it always
|
993
|
+
# upcast the arrays to np.float64. After gh16662, check expected promotion
|
994
|
+
# and that the expected sentinel is found.
|
995
|
+
|
996
|
+
# these are important because the max of the promoted dtype is the first
|
997
|
+
# candidate to be the sentinel value
|
998
|
+
max16 = np.iinfo(np.int16).max
|
999
|
+
max128c = np.finfo(np.complex128).max
|
1000
|
+
|
1001
|
+
# a is a regular array, b has masked elements, and c has no masked elements
|
1002
|
+
a = np.array([1, 2, max16], dtype=np.int16)
|
1003
|
+
b = np.ma.array([1, 2, 1], dtype=np.int8, mask=[0, 1, 0])
|
1004
|
+
c = np.ma.array([1, 2, 1], dtype=np.complex128, mask=[0, 0, 0])
|
1005
|
+
|
1006
|
+
# check integer masked -> sentinel conversion
|
1007
|
+
out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([a, b])
|
1008
|
+
a_out, b_out = out_arrays
|
1009
|
+
assert sentinel == max16-1 # not max16 because max16 was in the data
|
1010
|
+
assert b_out.dtype == np.int16 # check expected promotion
|
1011
|
+
assert_allclose(b_out, [b[0], sentinel, b[-1]]) # check sentinel placement
|
1012
|
+
assert a_out is a # not a masked array, so left untouched
|
1013
|
+
assert not isinstance(b_out, np.ma.MaskedArray) # b became regular array
|
1014
|
+
|
1015
|
+
# similarly with complex
|
1016
|
+
out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([b, c])
|
1017
|
+
b_out, c_out = out_arrays
|
1018
|
+
assert sentinel == max128c # max128c was not in the data
|
1019
|
+
assert b_out.dtype == np.complex128 # b got promoted
|
1020
|
+
assert_allclose(b_out, [b[0], sentinel, b[-1]]) # check sentinel placement
|
1021
|
+
assert not isinstance(b_out, np.ma.MaskedArray) # b became regular array
|
1022
|
+
assert not isinstance(c_out, np.ma.MaskedArray) # c became regular array
|
1023
|
+
|
1024
|
+
# Also, check edge case when a sentinel value cannot be found in the data
|
1025
|
+
min8, max8 = np.iinfo(np.int8).min, np.iinfo(np.int8).max
|
1026
|
+
a = np.arange(min8, max8+1, dtype=np.int8) # use all possible values
|
1027
|
+
mask1 = np.zeros_like(a, dtype=bool)
|
1028
|
+
mask0 = np.zeros_like(a, dtype=bool)
|
1029
|
+
|
1030
|
+
# a masked value can be used as the sentinel
|
1031
|
+
mask1[1] = True
|
1032
|
+
a1 = np.ma.array(a, mask=mask1)
|
1033
|
+
out_arrays, sentinel = _masked_arrays_2_sentinel_arrays([a1])
|
1034
|
+
assert sentinel == min8+1
|
1035
|
+
|
1036
|
+
# unless it's the smallest possible; skipped for simiplicity (see code)
|
1037
|
+
mask0[0] = True
|
1038
|
+
a0 = np.ma.array(a, mask=mask0)
|
1039
|
+
message = "This function replaces masked elements with sentinel..."
|
1040
|
+
with pytest.raises(ValueError, match=message):
|
1041
|
+
_masked_arrays_2_sentinel_arrays([a0])
|
1042
|
+
|
1043
|
+
# test that dtype is preserved in functions
|
1044
|
+
a = np.ma.array([1, 2, 3], mask=[0, 1, 0], dtype=np.float32)
|
1045
|
+
assert stats.gmean(a).dtype == np.float32
|
1046
|
+
|
1047
|
+
|
1048
|
+
def test_masked_stat_1d():
|
1049
|
+
# basic test of _axis_nan_policy_factory with 1D masked sample
|
1050
|
+
males = [19, 22, 16, 29, 24]
|
1051
|
+
females = [20, 11, 17, 12]
|
1052
|
+
res = stats.mannwhitneyu(males, females)
|
1053
|
+
|
1054
|
+
# same result when extra nan is omitted
|
1055
|
+
females2 = [20, 11, 17, np.nan, 12]
|
1056
|
+
res2 = stats.mannwhitneyu(males, females2, nan_policy='omit')
|
1057
|
+
np.testing.assert_array_equal(res2, res)
|
1058
|
+
|
1059
|
+
# same result when extra element is masked
|
1060
|
+
females3 = [20, 11, 17, 1000, 12]
|
1061
|
+
mask3 = [False, False, False, True, False]
|
1062
|
+
females3 = np.ma.masked_array(females3, mask=mask3)
|
1063
|
+
res3 = stats.mannwhitneyu(males, females3)
|
1064
|
+
np.testing.assert_array_equal(res3, res)
|
1065
|
+
|
1066
|
+
# same result when extra nan is omitted and additional element is masked
|
1067
|
+
females4 = [20, 11, 17, np.nan, 1000, 12]
|
1068
|
+
mask4 = [False, False, False, False, True, False]
|
1069
|
+
females4 = np.ma.masked_array(females4, mask=mask4)
|
1070
|
+
res4 = stats.mannwhitneyu(males, females4, nan_policy='omit')
|
1071
|
+
np.testing.assert_array_equal(res4, res)
|
1072
|
+
|
1073
|
+
# same result when extra elements, including nan, are masked
|
1074
|
+
females5 = [20, 11, 17, np.nan, 1000, 12]
|
1075
|
+
mask5 = [False, False, False, True, True, False]
|
1076
|
+
females5 = np.ma.masked_array(females5, mask=mask5)
|
1077
|
+
res5 = stats.mannwhitneyu(males, females5, nan_policy='propagate')
|
1078
|
+
res6 = stats.mannwhitneyu(males, females5, nan_policy='raise')
|
1079
|
+
np.testing.assert_array_equal(res5, res)
|
1080
|
+
np.testing.assert_array_equal(res6, res)
|
1081
|
+
|
1082
|
+
|
1083
|
+
@pytest.mark.filterwarnings('ignore:After omitting NaNs...')
|
1084
|
+
@pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
|
1085
|
+
@skip_xp_invalid_arg
|
1086
|
+
@pytest.mark.parametrize(("axis"), range(-3, 3))
|
1087
|
+
def test_masked_stat_3d(axis):
|
1088
|
+
# basic test of _axis_nan_policy_factory with 3D masked sample
|
1089
|
+
np.random.seed(0)
|
1090
|
+
a = np.random.rand(3, 4, 5)
|
1091
|
+
b = np.random.rand(4, 5)
|
1092
|
+
c = np.random.rand(4, 1)
|
1093
|
+
|
1094
|
+
mask_a = a < 0.1
|
1095
|
+
mask_c = [False, False, False, True]
|
1096
|
+
a_masked = np.ma.masked_array(a, mask=mask_a)
|
1097
|
+
c_masked = np.ma.masked_array(c, mask=mask_c)
|
1098
|
+
|
1099
|
+
a_nans = a.copy()
|
1100
|
+
a_nans[mask_a] = np.nan
|
1101
|
+
c_nans = c.copy()
|
1102
|
+
c_nans[mask_c] = np.nan
|
1103
|
+
|
1104
|
+
res = stats.kruskal(a_nans, b, c_nans, nan_policy='omit', axis=axis)
|
1105
|
+
res2 = stats.kruskal(a_masked, b, c_masked, axis=axis)
|
1106
|
+
np.testing.assert_array_equal(res, res2)
|
1107
|
+
|
1108
|
+
|
1109
|
+
@pytest.mark.filterwarnings('ignore:After omitting NaNs...')
|
1110
|
+
@pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
|
1111
|
+
@skip_xp_invalid_arg
|
1112
|
+
def test_mixed_mask_nan_1():
|
1113
|
+
# targeted test of _axis_nan_policy_factory with 2D masked sample:
|
1114
|
+
# omitting samples with masks and nan_policy='omit' are equivalent
|
1115
|
+
# also checks paired-sample sentinel value removal
|
1116
|
+
m, n = 3, 20
|
1117
|
+
axis = -1
|
1118
|
+
|
1119
|
+
rng = np.random.RandomState(0)
|
1120
|
+
a = rng.rand(m, n)
|
1121
|
+
b = rng.rand(m, n)
|
1122
|
+
mask_a1 = rng.rand(m, n) < 0.2
|
1123
|
+
mask_a2 = rng.rand(m, n) < 0.1
|
1124
|
+
mask_b1 = rng.rand(m, n) < 0.15
|
1125
|
+
mask_b2 = rng.rand(m, n) < 0.15
|
1126
|
+
mask_a1[2, :] = True
|
1127
|
+
|
1128
|
+
a_nans = a.copy()
|
1129
|
+
b_nans = b.copy()
|
1130
|
+
a_nans[mask_a1 | mask_a2] = np.nan
|
1131
|
+
b_nans[mask_b1 | mask_b2] = np.nan
|
1132
|
+
|
1133
|
+
a_masked1 = np.ma.masked_array(a, mask=mask_a1)
|
1134
|
+
b_masked1 = np.ma.masked_array(b, mask=mask_b1)
|
1135
|
+
a_masked1[mask_a2] = np.nan
|
1136
|
+
b_masked1[mask_b2] = np.nan
|
1137
|
+
|
1138
|
+
a_masked2 = np.ma.masked_array(a, mask=mask_a2)
|
1139
|
+
b_masked2 = np.ma.masked_array(b, mask=mask_b2)
|
1140
|
+
a_masked2[mask_a1] = np.nan
|
1141
|
+
b_masked2[mask_b1] = np.nan
|
1142
|
+
|
1143
|
+
a_masked3 = np.ma.masked_array(a, mask=(mask_a1 | mask_a2))
|
1144
|
+
b_masked3 = np.ma.masked_array(b, mask=(mask_b1 | mask_b2))
|
1145
|
+
|
1146
|
+
res = stats.wilcoxon(a_nans, b_nans, nan_policy='omit', axis=axis)
|
1147
|
+
res1 = stats.wilcoxon(a_masked1, b_masked1, nan_policy='omit', axis=axis)
|
1148
|
+
res2 = stats.wilcoxon(a_masked2, b_masked2, nan_policy='omit', axis=axis)
|
1149
|
+
res3 = stats.wilcoxon(a_masked3, b_masked3, nan_policy='raise', axis=axis)
|
1150
|
+
res4 = stats.wilcoxon(a_masked3, b_masked3,
|
1151
|
+
nan_policy='propagate', axis=axis)
|
1152
|
+
|
1153
|
+
np.testing.assert_array_equal(res1, res)
|
1154
|
+
np.testing.assert_array_equal(res2, res)
|
1155
|
+
np.testing.assert_array_equal(res3, res)
|
1156
|
+
np.testing.assert_array_equal(res4, res)
|
1157
|
+
|
1158
|
+
|
1159
|
+
@pytest.mark.filterwarnings('ignore:After omitting NaNs...')
|
1160
|
+
@pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
|
1161
|
+
@skip_xp_invalid_arg
|
1162
|
+
def test_mixed_mask_nan_2():
|
1163
|
+
# targeted test of _axis_nan_policy_factory with 2D masked sample:
|
1164
|
+
# check for expected interaction between masks and nans
|
1165
|
+
|
1166
|
+
# Cases here are
|
1167
|
+
# [mixed nan/mask, all nans, all masked,
|
1168
|
+
# unmasked nan, masked nan, unmasked non-nan]
|
1169
|
+
a = [[1, np.nan, 2], [np.nan, np.nan, np.nan], [1, 2, 3],
|
1170
|
+
[1, np.nan, 3], [1, np.nan, 3], [1, 2, 3]]
|
1171
|
+
mask = [[1, 0, 1], [0, 0, 0], [1, 1, 1],
|
1172
|
+
[0, 0, 0], [0, 1, 0], [0, 0, 0]]
|
1173
|
+
a_masked = np.ma.masked_array(a, mask=mask)
|
1174
|
+
b = [[4, 5, 6]]
|
1175
|
+
ref1 = stats.ranksums([1, 3], [4, 5, 6])
|
1176
|
+
ref2 = stats.ranksums([1, 2, 3], [4, 5, 6])
|
1177
|
+
|
1178
|
+
# nan_policy = 'omit'
|
1179
|
+
# all elements are removed from first three rows
|
1180
|
+
# middle element is removed from fourth and fifth rows
|
1181
|
+
# no elements removed from last row
|
1182
|
+
res = stats.ranksums(a_masked, b, nan_policy='omit', axis=-1)
|
1183
|
+
stat_ref = [np.nan, np.nan, np.nan,
|
1184
|
+
ref1.statistic, ref1.statistic, ref2.statistic]
|
1185
|
+
p_ref = [np.nan, np.nan, np.nan,
|
1186
|
+
ref1.pvalue, ref1.pvalue, ref2.pvalue]
|
1187
|
+
np.testing.assert_array_equal(res.statistic, stat_ref)
|
1188
|
+
np.testing.assert_array_equal(res.pvalue, p_ref)
|
1189
|
+
|
1190
|
+
# nan_policy = 'propagate'
|
1191
|
+
# nans propagate in first, second, and fourth row
|
1192
|
+
# all elements are removed by mask from third row
|
1193
|
+
# middle element is removed from fifth row
|
1194
|
+
# no elements removed from last row
|
1195
|
+
res = stats.ranksums(a_masked, b, nan_policy='propagate', axis=-1)
|
1196
|
+
stat_ref = [np.nan, np.nan, np.nan,
|
1197
|
+
np.nan, ref1.statistic, ref2.statistic]
|
1198
|
+
p_ref = [np.nan, np.nan, np.nan,
|
1199
|
+
np.nan, ref1.pvalue, ref2.pvalue]
|
1200
|
+
np.testing.assert_array_equal(res.statistic, stat_ref)
|
1201
|
+
np.testing.assert_array_equal(res.pvalue, p_ref)
|
1202
|
+
|
1203
|
+
|
1204
|
+
def test_axis_None_vs_tuple():
|
1205
|
+
# `axis` `None` should be equivalent to tuple with all axes
|
1206
|
+
shape = (3, 8, 9, 10)
|
1207
|
+
rng = np.random.default_rng(0)
|
1208
|
+
x = rng.random(shape)
|
1209
|
+
res = stats.kruskal(*x, axis=None)
|
1210
|
+
res2 = stats.kruskal(*x, axis=(0, 1, 2))
|
1211
|
+
np.testing.assert_array_equal(res, res2)
|
1212
|
+
|
1213
|
+
|
1214
|
+
def test_axis_None_vs_tuple_with_broadcasting():
|
1215
|
+
# `axis` `None` should be equivalent to tuple with all axes,
|
1216
|
+
# which should be equivalent to raveling the arrays before passing them
|
1217
|
+
rng = np.random.default_rng(0)
|
1218
|
+
x = rng.random((5, 1))
|
1219
|
+
y = rng.random((1, 5))
|
1220
|
+
x2, y2 = np.broadcast_arrays(x, y)
|
1221
|
+
|
1222
|
+
res0 = stats.mannwhitneyu(x.ravel(), y.ravel())
|
1223
|
+
res1 = stats.mannwhitneyu(x, y, axis=None)
|
1224
|
+
res2 = stats.mannwhitneyu(x, y, axis=(0, 1))
|
1225
|
+
res3 = stats.mannwhitneyu(x2.ravel(), y2.ravel())
|
1226
|
+
|
1227
|
+
assert res1 == res0
|
1228
|
+
assert res2 == res0
|
1229
|
+
assert res3 != res0
|
1230
|
+
|
1231
|
+
|
1232
|
+
@pytest.mark.parametrize(("axis"),
|
1233
|
+
list(permutations(range(-3, 3), 2)) + [(-4, 1)])
|
1234
|
+
def test_other_axis_tuples(axis):
|
1235
|
+
# Check that _axis_nan_policy_factory treats all `axis` tuples as expected
|
1236
|
+
rng = np.random.default_rng(0)
|
1237
|
+
shape_x = (4, 5, 6)
|
1238
|
+
shape_y = (1, 6)
|
1239
|
+
x = rng.random(shape_x)
|
1240
|
+
y = rng.random(shape_y)
|
1241
|
+
axis_original = axis
|
1242
|
+
|
1243
|
+
# convert axis elements to positive
|
1244
|
+
axis = tuple([(i if i >= 0 else 3 + i) for i in axis])
|
1245
|
+
axis = sorted(axis)
|
1246
|
+
|
1247
|
+
if len(set(axis)) != len(axis):
|
1248
|
+
message = "`axis` must contain only distinct elements"
|
1249
|
+
with pytest.raises(AxisError, match=re.escape(message)):
|
1250
|
+
stats.mannwhitneyu(x, y, axis=axis_original)
|
1251
|
+
return
|
1252
|
+
|
1253
|
+
if axis[0] < 0 or axis[-1] > 2:
|
1254
|
+
message = "`axis` is out of bounds for array of dimension 3"
|
1255
|
+
with pytest.raises(AxisError, match=re.escape(message)):
|
1256
|
+
stats.mannwhitneyu(x, y, axis=axis_original)
|
1257
|
+
return
|
1258
|
+
|
1259
|
+
res = stats.mannwhitneyu(x, y, axis=axis_original)
|
1260
|
+
|
1261
|
+
# reference behavior
|
1262
|
+
not_axis = {0, 1, 2} - set(axis) # which axis is not part of `axis`
|
1263
|
+
not_axis = next(iter(not_axis)) # take it out of the set
|
1264
|
+
|
1265
|
+
x2 = x
|
1266
|
+
shape_y_broadcasted = [1, 1, 6]
|
1267
|
+
shape_y_broadcasted[not_axis] = shape_x[not_axis]
|
1268
|
+
y2 = np.broadcast_to(y, shape_y_broadcasted)
|
1269
|
+
|
1270
|
+
m = x2.shape[not_axis]
|
1271
|
+
x2 = np.moveaxis(x2, axis, (1, 2))
|
1272
|
+
y2 = np.moveaxis(y2, axis, (1, 2))
|
1273
|
+
x2 = np.reshape(x2, (m, -1))
|
1274
|
+
y2 = np.reshape(y2, (m, -1))
|
1275
|
+
res2 = stats.mannwhitneyu(x2, y2, axis=1)
|
1276
|
+
|
1277
|
+
np.testing.assert_array_equal(res, res2)
|
1278
|
+
|
1279
|
+
|
1280
|
+
@pytest.mark.filterwarnings('ignore:After omitting NaNs...')
|
1281
|
+
@pytest.mark.filterwarnings('ignore:One or more axis-slices of one...')
|
1282
|
+
@skip_xp_invalid_arg
|
1283
|
+
@pytest.mark.parametrize(
|
1284
|
+
("weighted_fun_name, unpacker"),
|
1285
|
+
[
|
1286
|
+
("gmean", lambda x: x),
|
1287
|
+
("hmean", lambda x: x),
|
1288
|
+
("pmean", lambda x: x),
|
1289
|
+
("combine_pvalues", lambda x: (x.pvalue, x.statistic)),
|
1290
|
+
],
|
1291
|
+
)
|
1292
|
+
def test_mean_mixed_mask_nan_weights(weighted_fun_name, unpacker):
|
1293
|
+
# targeted test of _axis_nan_policy_factory with 2D masked sample:
|
1294
|
+
# omitting samples with masks and nan_policy='omit' are equivalent
|
1295
|
+
# also checks paired-sample sentinel value removal
|
1296
|
+
|
1297
|
+
if weighted_fun_name == 'pmean':
|
1298
|
+
def weighted_fun(a, **kwargs):
|
1299
|
+
return stats.pmean(a, p=0.42, **kwargs)
|
1300
|
+
else:
|
1301
|
+
weighted_fun = getattr(stats, weighted_fun_name)
|
1302
|
+
|
1303
|
+
def func(*args, **kwargs):
|
1304
|
+
return unpacker(weighted_fun(*args, **kwargs))
|
1305
|
+
|
1306
|
+
m, n = 3, 20
|
1307
|
+
axis = -1
|
1308
|
+
|
1309
|
+
rng = np.random.default_rng(6541968121)
|
1310
|
+
a = rng.uniform(size=(m, n))
|
1311
|
+
b = rng.uniform(size=(m, n))
|
1312
|
+
mask_a1 = rng.uniform(size=(m, n)) < 0.2
|
1313
|
+
mask_a2 = rng.uniform(size=(m, n)) < 0.1
|
1314
|
+
mask_b1 = rng.uniform(size=(m, n)) < 0.15
|
1315
|
+
mask_b2 = rng.uniform(size=(m, n)) < 0.15
|
1316
|
+
mask_a1[2, :] = True
|
1317
|
+
|
1318
|
+
a_nans = a.copy()
|
1319
|
+
b_nans = b.copy()
|
1320
|
+
a_nans[mask_a1 | mask_a2] = np.nan
|
1321
|
+
b_nans[mask_b1 | mask_b2] = np.nan
|
1322
|
+
|
1323
|
+
a_masked1 = np.ma.masked_array(a, mask=mask_a1)
|
1324
|
+
b_masked1 = np.ma.masked_array(b, mask=mask_b1)
|
1325
|
+
a_masked1[mask_a2] = np.nan
|
1326
|
+
b_masked1[mask_b2] = np.nan
|
1327
|
+
|
1328
|
+
a_masked2 = np.ma.masked_array(a, mask=mask_a2)
|
1329
|
+
b_masked2 = np.ma.masked_array(b, mask=mask_b2)
|
1330
|
+
a_masked2[mask_a1] = np.nan
|
1331
|
+
b_masked2[mask_b1] = np.nan
|
1332
|
+
|
1333
|
+
a_masked3 = np.ma.masked_array(a, mask=(mask_a1 | mask_a2))
|
1334
|
+
b_masked3 = np.ma.masked_array(b, mask=(mask_b1 | mask_b2))
|
1335
|
+
|
1336
|
+
with np.testing.suppress_warnings() as sup:
|
1337
|
+
message = 'invalid value encountered'
|
1338
|
+
sup.filter(RuntimeWarning, message)
|
1339
|
+
res = func(a_nans, weights=b_nans, nan_policy="omit", axis=axis)
|
1340
|
+
res1 = func(a_masked1, weights=b_masked1, nan_policy="omit", axis=axis)
|
1341
|
+
res2 = func(a_masked2, weights=b_masked2, nan_policy="omit", axis=axis)
|
1342
|
+
res3 = func(a_masked3, weights=b_masked3, nan_policy="raise", axis=axis)
|
1343
|
+
res4 = func(a_masked3, weights=b_masked3, nan_policy="propagate", axis=axis)
|
1344
|
+
|
1345
|
+
np.testing.assert_array_equal(res1, res)
|
1346
|
+
np.testing.assert_array_equal(res2, res)
|
1347
|
+
np.testing.assert_array_equal(res3, res)
|
1348
|
+
np.testing.assert_array_equal(res4, res)
|
1349
|
+
|
1350
|
+
|
1351
|
+
def test_raise_invalid_args_g17713():
|
1352
|
+
# other cases are handled in:
|
1353
|
+
# test_axis_nan_policy_decorated_positional_axis - multiple values for arg
|
1354
|
+
# test_axis_nan_policy_decorated_positional_args - unexpected kwd arg
|
1355
|
+
message = "got an unexpected keyword argument"
|
1356
|
+
with pytest.raises(TypeError, match=message):
|
1357
|
+
stats.gmean([1, 2, 3], invalid_arg=True)
|
1358
|
+
|
1359
|
+
message = " got multiple values for argument"
|
1360
|
+
with pytest.raises(TypeError, match=message):
|
1361
|
+
stats.gmean([1, 2, 3], a=True)
|
1362
|
+
|
1363
|
+
message = "missing 1 required positional argument"
|
1364
|
+
with pytest.raises(TypeError, match=message):
|
1365
|
+
stats.gmean()
|
1366
|
+
|
1367
|
+
message = "takes from 1 to 4 positional arguments but 5 were given"
|
1368
|
+
with pytest.raises(TypeError, match=message):
|
1369
|
+
stats.gmean([1, 2, 3], 0, float, [1, 1, 1], 10)
|
1370
|
+
|
1371
|
+
|
1372
|
+
@pytest.mark.parametrize('dtype', [np.int16, np.float32, np.complex128])
|
1373
|
+
def test_array_like_input(dtype):
|
1374
|
+
# Check that `_axis_nan_policy`-decorated functions work with custom
|
1375
|
+
# containers that are coercible to numeric arrays
|
1376
|
+
|
1377
|
+
class ArrLike:
|
1378
|
+
def __init__(self, x, dtype):
|
1379
|
+
self._x = x
|
1380
|
+
self._dtype = dtype
|
1381
|
+
|
1382
|
+
def __array__(self, dtype=None, copy=None):
|
1383
|
+
return np.asarray(x, dtype=self._dtype)
|
1384
|
+
|
1385
|
+
x = [1]*2 + [3, 4, 5]
|
1386
|
+
res = stats.mode(ArrLike(x, dtype=dtype))
|
1387
|
+
assert res.mode == 1
|
1388
|
+
assert res.count == 2
|