scipy 1.16.2__cp314-cp314-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.cp314-win_arm64.lib +0 -0
- scipy/_cyutility.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/_lib/_ccallback_c.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/_lib/_fpumode.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/_lib/_test_ccallback.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp314-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_call.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp314-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_def.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/_lib/_uarray/_uarray.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/_lib/messagestream.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/cluster/_hierarchy.cp314-win_arm64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.lib +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.pyd +0 -0
- scipy/cluster/_vq.cp314-win_arm64.lib +0 -0
- scipy/cluster/_vq.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/fftpack/convolve.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/integrate/_dop.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/integrate/_lsoda.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_ode.py +1395 -0
- scipy/integrate/_odepack.cp314-win_arm64.lib +0 -0
- scipy/integrate/_odepack.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_odepack_py.py +273 -0
- scipy/integrate/_quad_vec.py +674 -0
- scipy/integrate/_quadpack.cp314-win_arm64.lib +0 -0
- scipy/integrate/_quadpack.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/integrate/_test_multivariate.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp314-win_arm64.lib +0 -0
- scipy/integrate/_test_odeint_banded.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_vode.cp314-win_arm64.lib +0 -0
- scipy/integrate/_vode.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_dfitpack.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_dierckx.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_dierckx.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_fitpack.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_fitpack.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_interpnd.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_ppoly.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_rbf.py +290 -0
- scipy/interpolate/_rbfinterp.py +550 -0
- scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_rgi.py +764 -0
- scipy/interpolate/_rgi_cython.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_rgi_cython.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/io/_test_fortran.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/io/matlab/_mio5_utils.cp314-win_arm64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp314-win_arm64.lib +0 -0
- scipy/io/matlab/_mio_utils.cp314-win_arm64.pyd +0 -0
- scipy/io/matlab/_miobase.py +435 -0
- scipy/io/matlab/_streams.cp314-win_arm64.lib +0 -0
- scipy/io/matlab/_streams.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/linalg/_cythonized_array_utils.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/linalg/_decomp_interpolative.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +356 -0
- scipy/linalg/_decomp_lu.py +401 -0
- scipy/linalg/_decomp_lu_cython.cp314-win_arm64.lib +0 -0
- scipy/linalg/_decomp_lu_cython.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/linalg/_decomp_update.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +417 -0
- scipy/linalg/_fblas.cp314-win_arm64.lib +0 -0
- scipy/linalg/_fblas.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_flapack.cp314-win_arm64.lib +0 -0
- scipy/linalg/_flapack.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_lapack_subroutines.h +1521 -0
- scipy/linalg/_linalg_pythran.cp314-win_arm64.lib +0 -0
- scipy/linalg/_linalg_pythran.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs.py +1050 -0
- scipy/linalg/_matfuncs_expm.cp314-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_expm.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +107 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/linalg/_solve_toeplitz.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/linalg/cython_blas.cp314-win_arm64.pyd +0 -0
- scipy/linalg/cython_blas.pxd +169 -0
- scipy/linalg/cython_blas.pyx +1432 -0
- scipy/linalg/cython_lapack.cp314-win_arm64.lib +0 -0
- scipy/linalg/cython_lapack.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_ctest.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_cytest.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_cytest.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_nd_image.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_ndimage_api.py +16 -0
- scipy/ndimage/_ni_docstrings.py +214 -0
- scipy/ndimage/_ni_label.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_ni_label.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_ni_support.py +139 -0
- scipy/ndimage/_rank_filter_1d.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_rank_filter_1d.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/odr/__odrpack.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_bglu_dense.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_direct.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_group_columns.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_hessian_update_strategy.py +479 -0
- scipy/optimize/_highspy/__init__.py +0 -0
- scipy/optimize/_highspy/_core.cp314-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_core.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp314-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_highs_options.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_wrapper.py +338 -0
- scipy/optimize/_isotonic.py +157 -0
- scipy/optimize/_lbfgsb.cp314-win_arm64.lib +0 -0
- scipy/optimize/_lbfgsb.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_lsap.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_lsq/givens_elimination.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_minpack.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_minpack_py.py +1178 -0
- scipy/optimize/_moduleTNC.cp314-win_arm64.lib +0 -0
- scipy/optimize/_moduleTNC.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_pava_pybind.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_slsqplib.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_trlib/_trlib.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/_zeros.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/optimize/cython_optimize/_zeros.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/signal/_max_len_seq_inner.cp314-win_arm64.pyd +0 -0
- scipy/signal/_peak_finding.py +1310 -0
- scipy/signal/_peak_finding_utils.cp314-win_arm64.lib +0 -0
- scipy/signal/_peak_finding_utils.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/signal/_sigtools.cp314-win_arm64.pyd +0 -0
- scipy/signal/_sosfilt.cp314-win_arm64.lib +0 -0
- scipy/signal/_sosfilt.cp314-win_arm64.pyd +0 -0
- scipy/signal/_spectral_py.py +2471 -0
- scipy/signal/_spline.cp314-win_arm64.lib +0 -0
- scipy/signal/_spline.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/signal/_upfirdn_apply.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/sparse/_csparsetools.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/sparse/_sparsetools.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_flow.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_laplacian.py +563 -0
- scipy/sparse/csgraph/_matching.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_matching.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_reordering.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_tools.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_traversal.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/spatial/_ckdtree.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp314-win_arm64.lib +0 -0
- scipy/spatial/_distance_pybind.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp314-win_arm64.lib +0 -0
- scipy/spatial/_distance_wrap.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_geometric_slerp.py +238 -0
- scipy/spatial/_hausdorff.cp314-win_arm64.lib +0 -0
- scipy/spatial/_hausdorff.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/spatial/_qhull.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_qhull.pyi +213 -0
- scipy/spatial/_spherical_voronoi.py +341 -0
- scipy/spatial/_voronoi.cp314-win_arm64.lib +0 -0
- scipy/spatial/_voronoi.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/spatial/transform/_rigid_transform.cp314-win_arm64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp314-win_arm64.lib +0 -0
- scipy/spatial/transform/_rotation.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/special/_comb.cp314-win_arm64.pyd +0 -0
- scipy/special/_ellip_harm.py +214 -0
- scipy/special/_ellip_harm_2.cp314-win_arm64.lib +0 -0
- scipy/special/_ellip_harm_2.cp314-win_arm64.pyd +0 -0
- scipy/special/_gufuncs.cp314-win_arm64.lib +0 -0
- scipy/special/_gufuncs.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/special/_specfun.cp314-win_arm64.pyd +0 -0
- scipy/special/_special_ufuncs.cp314-win_arm64.lib +0 -0
- scipy/special/_special_ufuncs.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/special/_test_internal.cp314-win_arm64.pyd +0 -0
- scipy/special/_test_internal.pyi +9 -0
- scipy/special/_testutils.py +321 -0
- scipy/special/_ufuncs.cp314-win_arm64.lib +0 -0
- scipy/special/_ufuncs.cp314-win_arm64.pyd +0 -0
- scipy/special/_ufuncs.pyi +522 -0
- scipy/special/_ufuncs.pyx +13173 -0
- scipy/special/_ufuncs_cxx.cp314-win_arm64.lib +0 -0
- scipy/special/_ufuncs_cxx.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/special/cython_special.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +692 -0
- scipy/stats/_biasedurn.cp314-win_arm64.lib +0 -0
- scipy/stats/_biasedurn.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/stats/_levy_stable/levyst.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/stats/_qmc_cy.cp314-win_arm64.pyd +0 -0
- scipy/stats/_qmc_cy.pyi +54 -0
- scipy/stats/_qmvnt.py +454 -0
- scipy/stats/_qmvnt_cy.cp314-win_arm64.lib +0 -0
- scipy/stats/_qmvnt_cy.cp314-win_arm64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/__init__.py +4 -0
- scipy/stats/_rcont/rcont.cp314-win_arm64.lib +0 -0
- scipy/stats/_rcont/rcont.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/stats/_sobol.cp314-win_arm64.pyd +0 -0
- scipy/stats/_sobol.pyi +54 -0
- scipy/stats/_sobol_direction_numbers.npz +0 -0
- scipy/stats/_stats.cp314-win_arm64.lib +0 -0
- scipy/stats/_stats.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/stats/_stats_pythran.cp314-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.cp314-win_arm64.lib +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp314-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,2098 @@
|
|
1
|
+
#
|
2
|
+
# Author: Travis Oliphant 2002-2011 with contributions from
|
3
|
+
# SciPy Developers 2004-2011
|
4
|
+
#
|
5
|
+
from functools import partial
|
6
|
+
|
7
|
+
from scipy import special
|
8
|
+
from scipy.special import entr, logsumexp, betaln, gammaln as gamln, zeta
|
9
|
+
from scipy._lib._util import rng_integers
|
10
|
+
import scipy._lib.array_api_extra as xpx
|
11
|
+
from scipy.interpolate import interp1d
|
12
|
+
|
13
|
+
from numpy import floor, ceil, log, exp, sqrt, log1p, expm1, tanh, cosh, sinh
|
14
|
+
|
15
|
+
import numpy as np
|
16
|
+
|
17
|
+
from ._distn_infrastructure import (rv_discrete, get_distribution_names,
|
18
|
+
_vectorize_rvs_over_shapes,
|
19
|
+
_ShapeInfo, _isintegral,
|
20
|
+
rv_discrete_frozen)
|
21
|
+
from ._biasedurn import (_PyFishersNCHypergeometric,
|
22
|
+
_PyWalleniusNCHypergeometric,
|
23
|
+
_PyStochasticLib3)
|
24
|
+
from ._stats_pythran import _poisson_binom
|
25
|
+
|
26
|
+
import scipy.special._ufuncs as scu
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
class binom_gen(rv_discrete):
|
31
|
+
r"""A binomial discrete random variable.
|
32
|
+
|
33
|
+
%(before_notes)s
|
34
|
+
|
35
|
+
Notes
|
36
|
+
-----
|
37
|
+
The probability mass function for `binom` is:
|
38
|
+
|
39
|
+
.. math::
|
40
|
+
|
41
|
+
f(k) = \binom{n}{k} p^k (1-p)^{n-k}
|
42
|
+
|
43
|
+
for :math:`k \in \{0, 1, \dots, n\}`, :math:`0 \leq p \leq 1`
|
44
|
+
|
45
|
+
`binom` takes :math:`n` and :math:`p` as shape parameters,
|
46
|
+
where :math:`p` is the probability of a single success
|
47
|
+
and :math:`1-p` is the probability of a single failure.
|
48
|
+
|
49
|
+
This distribution uses routines from the Boost Math C++ library for
|
50
|
+
the computation of the ``pmf``, ``cdf``, ``sf``, ``ppf`` and ``isf``
|
51
|
+
methods. [1]_
|
52
|
+
|
53
|
+
%(after_notes)s
|
54
|
+
|
55
|
+
References
|
56
|
+
----------
|
57
|
+
.. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.
|
58
|
+
|
59
|
+
%(example)s
|
60
|
+
|
61
|
+
See Also
|
62
|
+
--------
|
63
|
+
hypergeom, nbinom, nhypergeom
|
64
|
+
|
65
|
+
"""
|
66
|
+
def _shape_info(self):
|
67
|
+
return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
|
68
|
+
_ShapeInfo("p", False, (0, 1), (True, True))]
|
69
|
+
|
70
|
+
def _rvs(self, n, p, size=None, random_state=None):
|
71
|
+
return random_state.binomial(n, p, size)
|
72
|
+
|
73
|
+
def _argcheck(self, n, p):
|
74
|
+
return (n >= 0) & _isintegral(n) & (p >= 0) & (p <= 1)
|
75
|
+
|
76
|
+
def _get_support(self, n, p):
|
77
|
+
return self.a, n
|
78
|
+
|
79
|
+
def _logpmf(self, x, n, p):
|
80
|
+
k = floor(x)
|
81
|
+
combiln = (gamln(n+1) - (gamln(k+1) + gamln(n-k+1)))
|
82
|
+
return combiln + special.xlogy(k, p) + special.xlog1py(n-k, -p)
|
83
|
+
|
84
|
+
def _pmf(self, x, n, p):
|
85
|
+
# binom.pmf(k) = choose(n, k) * p**k * (1-p)**(n-k)
|
86
|
+
return scu._binom_pmf(x, n, p)
|
87
|
+
|
88
|
+
def _cdf(self, x, n, p):
|
89
|
+
k = floor(x)
|
90
|
+
return scu._binom_cdf(k, n, p)
|
91
|
+
|
92
|
+
def _sf(self, x, n, p):
|
93
|
+
k = floor(x)
|
94
|
+
return scu._binom_sf(k, n, p)
|
95
|
+
|
96
|
+
def _isf(self, x, n, p):
|
97
|
+
return scu._binom_isf(x, n, p)
|
98
|
+
|
99
|
+
def _ppf(self, q, n, p):
|
100
|
+
return scu._binom_ppf(q, n, p)
|
101
|
+
|
102
|
+
def _stats(self, n, p, moments='mv'):
|
103
|
+
mu = n * p
|
104
|
+
var = mu - n * np.square(p)
|
105
|
+
g1, g2 = None, None
|
106
|
+
if 's' in moments:
|
107
|
+
pq = p - np.square(p)
|
108
|
+
npq_sqrt = np.sqrt(n * pq)
|
109
|
+
t1 = np.reciprocal(npq_sqrt)
|
110
|
+
t2 = (2.0 * p) / npq_sqrt
|
111
|
+
g1 = t1 - t2
|
112
|
+
if 'k' in moments:
|
113
|
+
pq = p - np.square(p)
|
114
|
+
npq = n * pq
|
115
|
+
t1 = np.reciprocal(npq)
|
116
|
+
t2 = 6.0/n
|
117
|
+
g2 = t1 - t2
|
118
|
+
return mu, var, g1, g2
|
119
|
+
|
120
|
+
def _entropy(self, n, p):
|
121
|
+
k = np.r_[0:n + 1]
|
122
|
+
vals = self._pmf(k, n, p)
|
123
|
+
return np.sum(entr(vals), axis=0)
|
124
|
+
|
125
|
+
|
126
|
+
binom = binom_gen(name='binom')
|
127
|
+
|
128
|
+
|
129
|
+
class bernoulli_gen(binom_gen):
|
130
|
+
r"""A Bernoulli discrete random variable.
|
131
|
+
|
132
|
+
%(before_notes)s
|
133
|
+
|
134
|
+
Notes
|
135
|
+
-----
|
136
|
+
The probability mass function for `bernoulli` is:
|
137
|
+
|
138
|
+
.. math::
|
139
|
+
|
140
|
+
f(k) = \begin{cases}1-p &\text{if } k = 0\\
|
141
|
+
p &\text{if } k = 1\end{cases}
|
142
|
+
|
143
|
+
for :math:`k` in :math:`\{0, 1\}`, :math:`0 \leq p \leq 1`
|
144
|
+
|
145
|
+
`bernoulli` takes :math:`p` as shape parameter,
|
146
|
+
where :math:`p` is the probability of a single success
|
147
|
+
and :math:`1-p` is the probability of a single failure.
|
148
|
+
|
149
|
+
%(after_notes)s
|
150
|
+
|
151
|
+
%(example)s
|
152
|
+
|
153
|
+
"""
|
154
|
+
def _shape_info(self):
|
155
|
+
return [_ShapeInfo("p", False, (0, 1), (True, True))]
|
156
|
+
|
157
|
+
def _rvs(self, p, size=None, random_state=None):
|
158
|
+
return binom_gen._rvs(self, 1, p, size=size, random_state=random_state)
|
159
|
+
|
160
|
+
def _argcheck(self, p):
|
161
|
+
return (p >= 0) & (p <= 1)
|
162
|
+
|
163
|
+
def _get_support(self, p):
|
164
|
+
# Overrides binom_gen._get_support!x
|
165
|
+
return self.a, self.b
|
166
|
+
|
167
|
+
def _logpmf(self, x, p):
|
168
|
+
return binom._logpmf(x, 1, p)
|
169
|
+
|
170
|
+
def _pmf(self, x, p):
|
171
|
+
# bernoulli.pmf(k) = 1-p if k = 0
|
172
|
+
# = p if k = 1
|
173
|
+
return binom._pmf(x, 1, p)
|
174
|
+
|
175
|
+
def _cdf(self, x, p):
|
176
|
+
return binom._cdf(x, 1, p)
|
177
|
+
|
178
|
+
def _sf(self, x, p):
|
179
|
+
return binom._sf(x, 1, p)
|
180
|
+
|
181
|
+
def _isf(self, x, p):
|
182
|
+
return binom._isf(x, 1, p)
|
183
|
+
|
184
|
+
def _ppf(self, q, p):
|
185
|
+
return binom._ppf(q, 1, p)
|
186
|
+
|
187
|
+
def _stats(self, p):
|
188
|
+
return binom._stats(1, p)
|
189
|
+
|
190
|
+
def _entropy(self, p):
|
191
|
+
return entr(p) + entr(1-p)
|
192
|
+
|
193
|
+
|
194
|
+
bernoulli = bernoulli_gen(b=1, name='bernoulli')
|
195
|
+
|
196
|
+
|
197
|
+
class betabinom_gen(rv_discrete):
|
198
|
+
r"""A beta-binomial discrete random variable.
|
199
|
+
|
200
|
+
%(before_notes)s
|
201
|
+
|
202
|
+
Notes
|
203
|
+
-----
|
204
|
+
The beta-binomial distribution is a binomial distribution with a
|
205
|
+
probability of success `p` that follows a beta distribution.
|
206
|
+
|
207
|
+
The probability mass function for `betabinom` is:
|
208
|
+
|
209
|
+
.. math::
|
210
|
+
|
211
|
+
f(k) = \binom{n}{k} \frac{B(k + a, n - k + b)}{B(a, b)}
|
212
|
+
|
213
|
+
for :math:`k \in \{0, 1, \dots, n\}`, :math:`n \geq 0`, :math:`a > 0`,
|
214
|
+
:math:`b > 0`, where :math:`B(a, b)` is the beta function.
|
215
|
+
|
216
|
+
`betabinom` takes :math:`n`, :math:`a`, and :math:`b` as shape parameters.
|
217
|
+
|
218
|
+
%(after_notes)s
|
219
|
+
|
220
|
+
References
|
221
|
+
----------
|
222
|
+
.. [1] https://en.wikipedia.org/wiki/Beta-binomial_distribution
|
223
|
+
|
224
|
+
.. versionadded:: 1.4.0
|
225
|
+
|
226
|
+
See Also
|
227
|
+
--------
|
228
|
+
beta, binom
|
229
|
+
|
230
|
+
%(example)s
|
231
|
+
|
232
|
+
"""
|
233
|
+
def _shape_info(self):
|
234
|
+
return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
|
235
|
+
_ShapeInfo("a", False, (0, np.inf), (False, False)),
|
236
|
+
_ShapeInfo("b", False, (0, np.inf), (False, False))]
|
237
|
+
|
238
|
+
def _rvs(self, n, a, b, size=None, random_state=None):
|
239
|
+
p = random_state.beta(a, b, size)
|
240
|
+
return random_state.binomial(n, p, size)
|
241
|
+
|
242
|
+
def _get_support(self, n, a, b):
|
243
|
+
return 0, n
|
244
|
+
|
245
|
+
def _argcheck(self, n, a, b):
|
246
|
+
return (n >= 0) & _isintegral(n) & (a > 0) & (b > 0)
|
247
|
+
|
248
|
+
def _logpmf(self, x, n, a, b):
|
249
|
+
k = floor(x)
|
250
|
+
combiln = -log(n + 1) - betaln(n - k + 1, k + 1)
|
251
|
+
return combiln + betaln(k + a, n - k + b) - betaln(a, b)
|
252
|
+
|
253
|
+
def _pmf(self, x, n, a, b):
|
254
|
+
return exp(self._logpmf(x, n, a, b))
|
255
|
+
|
256
|
+
def _stats(self, n, a, b, moments='mv'):
|
257
|
+
e_p = a / (a + b)
|
258
|
+
e_q = 1 - e_p
|
259
|
+
mu = n * e_p
|
260
|
+
var = n * (a + b + n) * e_p * e_q / (a + b + 1)
|
261
|
+
g1, g2 = None, None
|
262
|
+
if 's' in moments:
|
263
|
+
g1 = 1.0 / sqrt(var)
|
264
|
+
g1 *= (a + b + 2 * n) * (b - a)
|
265
|
+
g1 /= (a + b + 2) * (a + b)
|
266
|
+
if 'k' in moments:
|
267
|
+
g2 = (a + b).astype(e_p.dtype)
|
268
|
+
g2 *= (a + b - 1 + 6 * n)
|
269
|
+
g2 += 3 * a * b * (n - 2)
|
270
|
+
g2 += 6 * n ** 2
|
271
|
+
g2 -= 3 * e_p * b * n * (6 - n)
|
272
|
+
g2 -= 18 * e_p * e_q * n ** 2
|
273
|
+
g2 *= (a + b) ** 2 * (1 + a + b)
|
274
|
+
g2 /= (n * a * b * (a + b + 2) * (a + b + 3) * (a + b + n))
|
275
|
+
g2 -= 3
|
276
|
+
return mu, var, g1, g2
|
277
|
+
|
278
|
+
|
279
|
+
betabinom = betabinom_gen(name='betabinom')
|
280
|
+
|
281
|
+
|
282
|
+
class nbinom_gen(rv_discrete):
|
283
|
+
r"""A negative binomial discrete random variable.
|
284
|
+
|
285
|
+
%(before_notes)s
|
286
|
+
|
287
|
+
Notes
|
288
|
+
-----
|
289
|
+
Negative binomial distribution describes a sequence of i.i.d. Bernoulli
|
290
|
+
trials, repeated until a predefined, non-random number of successes occurs.
|
291
|
+
|
292
|
+
The probability mass function of the number of failures for `nbinom` is:
|
293
|
+
|
294
|
+
.. math::
|
295
|
+
|
296
|
+
f(k) = \binom{k+n-1}{n-1} p^n (1-p)^k
|
297
|
+
|
298
|
+
for :math:`k \ge 0`, :math:`0 < p \leq 1`
|
299
|
+
|
300
|
+
`nbinom` takes :math:`n` and :math:`p` as shape parameters where :math:`n`
|
301
|
+
is the number of successes, :math:`p` is the probability of a single
|
302
|
+
success, and :math:`1-p` is the probability of a single failure.
|
303
|
+
|
304
|
+
Another common parameterization of the negative binomial distribution is
|
305
|
+
in terms of the mean number of failures :math:`\mu` to achieve :math:`n`
|
306
|
+
successes. The mean :math:`\mu` is related to the probability of success
|
307
|
+
as
|
308
|
+
|
309
|
+
.. math::
|
310
|
+
|
311
|
+
p = \frac{n}{n + \mu}
|
312
|
+
|
313
|
+
The number of successes :math:`n` may also be specified in terms of a
|
314
|
+
"dispersion", "heterogeneity", or "aggregation" parameter :math:`\alpha`,
|
315
|
+
which relates the mean :math:`\mu` to the variance :math:`\sigma^2`,
|
316
|
+
e.g. :math:`\sigma^2 = \mu + \alpha \mu^2`. Regardless of the convention
|
317
|
+
used for :math:`\alpha`,
|
318
|
+
|
319
|
+
.. math::
|
320
|
+
|
321
|
+
p &= \frac{\mu}{\sigma^2} \\
|
322
|
+
n &= \frac{\mu^2}{\sigma^2 - \mu}
|
323
|
+
|
324
|
+
This distribution uses routines from the Boost Math C++ library for
|
325
|
+
the computation of the ``pmf``, ``cdf``, ``sf``, ``ppf``, ``isf``
|
326
|
+
and ``stats`` methods. [1]_
|
327
|
+
|
328
|
+
%(after_notes)s
|
329
|
+
|
330
|
+
References
|
331
|
+
----------
|
332
|
+
.. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.
|
333
|
+
|
334
|
+
%(example)s
|
335
|
+
|
336
|
+
See Also
|
337
|
+
--------
|
338
|
+
hypergeom, binom, nhypergeom
|
339
|
+
|
340
|
+
"""
|
341
|
+
def _shape_info(self):
|
342
|
+
return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
|
343
|
+
_ShapeInfo("p", False, (0, 1), (True, True))]
|
344
|
+
|
345
|
+
def _rvs(self, n, p, size=None, random_state=None):
|
346
|
+
return random_state.negative_binomial(n, p, size)
|
347
|
+
|
348
|
+
def _argcheck(self, n, p):
|
349
|
+
return (n > 0) & (p > 0) & (p <= 1)
|
350
|
+
|
351
|
+
def _pmf(self, x, n, p):
|
352
|
+
# nbinom.pmf(k) = choose(k+n-1, n-1) * p**n * (1-p)**k
|
353
|
+
return scu._nbinom_pmf(x, n, p)
|
354
|
+
|
355
|
+
def _logpmf(self, x, n, p):
|
356
|
+
coeff = gamln(n+x) - gamln(x+1) - gamln(n)
|
357
|
+
return coeff + n*log(p) + special.xlog1py(x, -p)
|
358
|
+
|
359
|
+
def _cdf(self, x, n, p):
|
360
|
+
k = floor(x)
|
361
|
+
return scu._nbinom_cdf(k, n, p)
|
362
|
+
|
363
|
+
def _logcdf(self, x, n, p):
|
364
|
+
k = floor(x)
|
365
|
+
k, n, p = np.broadcast_arrays(k, n, p)
|
366
|
+
cdf = self._cdf(k, n, p)
|
367
|
+
cond = cdf > 0.5
|
368
|
+
def f1(k, n, p):
|
369
|
+
return np.log1p(-special.betainc(k + 1, n, 1 - p))
|
370
|
+
|
371
|
+
# do calc in place
|
372
|
+
logcdf = cdf
|
373
|
+
with np.errstate(divide='ignore'):
|
374
|
+
logcdf[cond] = f1(k[cond], n[cond], p[cond])
|
375
|
+
logcdf[~cond] = np.log(cdf[~cond])
|
376
|
+
return logcdf
|
377
|
+
|
378
|
+
def _sf(self, x, n, p):
|
379
|
+
k = floor(x)
|
380
|
+
return scu._nbinom_sf(k, n, p)
|
381
|
+
|
382
|
+
def _isf(self, x, n, p):
|
383
|
+
with np.errstate(over='ignore'): # see gh-17432
|
384
|
+
return scu._nbinom_isf(x, n, p)
|
385
|
+
|
386
|
+
def _ppf(self, q, n, p):
|
387
|
+
with np.errstate(over='ignore'): # see gh-17432
|
388
|
+
return scu._nbinom_ppf(q, n, p)
|
389
|
+
|
390
|
+
def _stats(self, n, p):
|
391
|
+
return (
|
392
|
+
scu._nbinom_mean(n, p),
|
393
|
+
scu._nbinom_variance(n, p),
|
394
|
+
scu._nbinom_skewness(n, p),
|
395
|
+
scu._nbinom_kurtosis_excess(n, p),
|
396
|
+
)
|
397
|
+
|
398
|
+
|
399
|
+
nbinom = nbinom_gen(name='nbinom')
|
400
|
+
|
401
|
+
|
402
|
+
class betanbinom_gen(rv_discrete):
|
403
|
+
r"""A beta-negative-binomial discrete random variable.
|
404
|
+
|
405
|
+
%(before_notes)s
|
406
|
+
|
407
|
+
Notes
|
408
|
+
-----
|
409
|
+
The beta-negative-binomial distribution is a negative binomial
|
410
|
+
distribution with a probability of success `p` that follows a
|
411
|
+
beta distribution.
|
412
|
+
|
413
|
+
The probability mass function for `betanbinom` is:
|
414
|
+
|
415
|
+
.. math::
|
416
|
+
|
417
|
+
f(k) = \binom{n + k - 1}{k} \frac{B(a + n, b + k)}{B(a, b)}
|
418
|
+
|
419
|
+
for :math:`k \ge 0`, :math:`n \geq 0`, :math:`a > 0`,
|
420
|
+
:math:`b > 0`, where :math:`B(a, b)` is the beta function.
|
421
|
+
|
422
|
+
`betanbinom` takes :math:`n`, :math:`a`, and :math:`b` as shape parameters.
|
423
|
+
|
424
|
+
%(after_notes)s
|
425
|
+
|
426
|
+
References
|
427
|
+
----------
|
428
|
+
.. [1] https://en.wikipedia.org/wiki/Beta_negative_binomial_distribution
|
429
|
+
|
430
|
+
.. versionadded:: 1.12.0
|
431
|
+
|
432
|
+
See Also
|
433
|
+
--------
|
434
|
+
betabinom : Beta binomial distribution
|
435
|
+
|
436
|
+
%(example)s
|
437
|
+
|
438
|
+
"""
|
439
|
+
def _shape_info(self):
|
440
|
+
return [_ShapeInfo("n", True, (0, np.inf), (True, False)),
|
441
|
+
_ShapeInfo("a", False, (0, np.inf), (False, False)),
|
442
|
+
_ShapeInfo("b", False, (0, np.inf), (False, False))]
|
443
|
+
|
444
|
+
def _rvs(self, n, a, b, size=None, random_state=None):
|
445
|
+
p = random_state.beta(a, b, size)
|
446
|
+
return random_state.negative_binomial(n, p, size)
|
447
|
+
|
448
|
+
def _argcheck(self, n, a, b):
|
449
|
+
return (n >= 0) & _isintegral(n) & (a > 0) & (b > 0)
|
450
|
+
|
451
|
+
def _logpmf(self, x, n, a, b):
|
452
|
+
k = floor(x)
|
453
|
+
combiln = -np.log(n + k) - betaln(n, k + 1)
|
454
|
+
return combiln + betaln(a + n, b + k) - betaln(a, b)
|
455
|
+
|
456
|
+
def _pmf(self, x, n, a, b):
|
457
|
+
return exp(self._logpmf(x, n, a, b))
|
458
|
+
|
459
|
+
def _stats(self, n, a, b, moments='mv'):
|
460
|
+
# reference: Wolfram Alpha input
|
461
|
+
# BetaNegativeBinomialDistribution[a, b, n]
|
462
|
+
def mean(n, a, b):
|
463
|
+
return n * b / (a - 1.)
|
464
|
+
mu = xpx.apply_where(a > 1, (n, a, b), mean, fill_value=np.inf)
|
465
|
+
def var(n, a, b):
|
466
|
+
return (n * b * (n + a - 1.) * (a + b - 1.)
|
467
|
+
/ ((a - 2.) * (a - 1.)**2.))
|
468
|
+
var = xpx.apply_where(a > 2, (n, a, b), var, fill_value=np.inf)
|
469
|
+
g1, g2 = None, None
|
470
|
+
def skew(n, a, b):
|
471
|
+
return ((2 * n + a - 1.) * (2 * b + a - 1.)
|
472
|
+
/ (a - 3.) / sqrt(n * b * (n + a - 1.) * (b + a - 1.)
|
473
|
+
/ (a - 2.)))
|
474
|
+
if 's' in moments:
|
475
|
+
g1 = xpx.apply_where(a > 3, (n, a, b), skew, fill_value=np.inf)
|
476
|
+
def kurtosis(n, a, b):
|
477
|
+
term = (a - 2.)
|
478
|
+
term_2 = ((a - 1.)**2. * (a**2. + a * (6 * b - 1.)
|
479
|
+
+ 6. * (b - 1.) * b)
|
480
|
+
+ 3. * n**2. * ((a + 5.) * b**2. + (a + 5.)
|
481
|
+
* (a - 1.) * b + 2. * (a - 1.)**2)
|
482
|
+
+ 3 * (a - 1.) * n
|
483
|
+
* ((a + 5.) * b**2. + (a + 5.) * (a - 1.) * b
|
484
|
+
+ 2. * (a - 1.)**2.))
|
485
|
+
denominator = ((a - 4.) * (a - 3.) * b * n
|
486
|
+
* (a + b - 1.) * (a + n - 1.))
|
487
|
+
# Wolfram Alpha uses Pearson kurtosis, so we subtract 3 to get
|
488
|
+
# scipy's Fisher kurtosis
|
489
|
+
return term * term_2 / denominator - 3.
|
490
|
+
if 'k' in moments:
|
491
|
+
g2 = xpx.apply_where(a > 4, (n, a, b), kurtosis, fill_value=np.inf)
|
492
|
+
return mu, var, g1, g2
|
493
|
+
|
494
|
+
|
495
|
+
betanbinom = betanbinom_gen(name='betanbinom')
|
496
|
+
|
497
|
+
|
498
|
+
class geom_gen(rv_discrete):
|
499
|
+
r"""A geometric discrete random variable.
|
500
|
+
|
501
|
+
%(before_notes)s
|
502
|
+
|
503
|
+
Notes
|
504
|
+
-----
|
505
|
+
The probability mass function for `geom` is:
|
506
|
+
|
507
|
+
.. math::
|
508
|
+
|
509
|
+
f(k) = (1-p)^{k-1} p
|
510
|
+
|
511
|
+
for :math:`k \ge 1`, :math:`0 < p \leq 1`
|
512
|
+
|
513
|
+
`geom` takes :math:`p` as shape parameter,
|
514
|
+
where :math:`p` is the probability of a single success
|
515
|
+
and :math:`1-p` is the probability of a single failure.
|
516
|
+
|
517
|
+
Note that when drawing random samples, the probability of observations that exceed
|
518
|
+
``np.iinfo(np.int64).max`` increases rapidly as $p$ decreases below $10^{-17}$. For
|
519
|
+
$p < 10^{-20}$, almost all observations would exceed the maximum ``int64``; however,
|
520
|
+
the output dtype is always ``int64``, so these values are clipped to the maximum.
|
521
|
+
|
522
|
+
%(after_notes)s
|
523
|
+
|
524
|
+
See Also
|
525
|
+
--------
|
526
|
+
planck
|
527
|
+
|
528
|
+
%(example)s
|
529
|
+
|
530
|
+
"""
|
531
|
+
|
532
|
+
def _shape_info(self):
|
533
|
+
return [_ShapeInfo("p", False, (0, 1), (True, True))]
|
534
|
+
|
535
|
+
def _rvs(self, p, size=None, random_state=None):
|
536
|
+
res = random_state.geometric(p, size=size)
|
537
|
+
# RandomState.geometric can wrap around to negative values; make behavior
|
538
|
+
# consistent with Generator.geometric by replacing with maximum integer.
|
539
|
+
max_int = np.iinfo(res.dtype).max
|
540
|
+
return np.where(res < 0, max_int, res)
|
541
|
+
|
542
|
+
def _argcheck(self, p):
|
543
|
+
return (p <= 1) & (p > 0)
|
544
|
+
|
545
|
+
def _pmf(self, k, p):
|
546
|
+
return np.power(1-p, k-1) * p
|
547
|
+
|
548
|
+
def _logpmf(self, k, p):
|
549
|
+
return special.xlog1py(k - 1, -p) + log(p)
|
550
|
+
|
551
|
+
def _cdf(self, x, p):
|
552
|
+
k = floor(x)
|
553
|
+
return -expm1(log1p(-p)*k)
|
554
|
+
|
555
|
+
def _sf(self, x, p):
|
556
|
+
return np.exp(self._logsf(x, p))
|
557
|
+
|
558
|
+
def _logsf(self, x, p):
|
559
|
+
k = floor(x)
|
560
|
+
return k*log1p(-p)
|
561
|
+
|
562
|
+
def _ppf(self, q, p):
|
563
|
+
vals = ceil(log1p(-q) / log1p(-p))
|
564
|
+
temp = self._cdf(vals-1, p)
|
565
|
+
return np.where((temp >= q) & (vals > 0), vals-1, vals)
|
566
|
+
|
567
|
+
def _stats(self, p):
|
568
|
+
mu = 1.0/p
|
569
|
+
qr = 1.0-p
|
570
|
+
var = qr / p / p
|
571
|
+
g1 = (2.0-p) / sqrt(qr)
|
572
|
+
g2 = np.polyval([1, -6, 6], p)/(1.0-p)
|
573
|
+
return mu, var, g1, g2
|
574
|
+
|
575
|
+
def _entropy(self, p):
|
576
|
+
return -np.log(p) - np.log1p(-p) * (1.0-p) / p
|
577
|
+
|
578
|
+
|
579
|
+
geom = geom_gen(a=1, name='geom', longname="A geometric")
|
580
|
+
|
581
|
+
|
582
|
+
class hypergeom_gen(rv_discrete):
|
583
|
+
r"""A hypergeometric discrete random variable.
|
584
|
+
|
585
|
+
The hypergeometric distribution models drawing objects from a bin.
|
586
|
+
`M` is the total number of objects, `n` is total number of Type I objects.
|
587
|
+
The random variate represents the number of Type I objects in `N` drawn
|
588
|
+
without replacement from the total population.
|
589
|
+
|
590
|
+
%(before_notes)s
|
591
|
+
|
592
|
+
Notes
|
593
|
+
-----
|
594
|
+
The symbols used to denote the shape parameters (`M`, `n`, and `N`) are not
|
595
|
+
universally accepted. See the Examples for a clarification of the
|
596
|
+
definitions used here.
|
597
|
+
|
598
|
+
The probability mass function is defined as,
|
599
|
+
|
600
|
+
.. math:: p(k, M, n, N) = \frac{\binom{n}{k} \binom{M - n}{N - k}}
|
601
|
+
{\binom{M}{N}}
|
602
|
+
|
603
|
+
for :math:`k \in [\max(0, N - M + n), \min(n, N)]`, where the binomial
|
604
|
+
coefficients are defined as,
|
605
|
+
|
606
|
+
.. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
|
607
|
+
|
608
|
+
This distribution uses routines from the Boost Math C++ library for
|
609
|
+
the computation of the ``pmf``, ``cdf``, ``sf`` and ``stats`` methods. [1]_
|
610
|
+
|
611
|
+
%(after_notes)s
|
612
|
+
|
613
|
+
References
|
614
|
+
----------
|
615
|
+
.. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.
|
616
|
+
|
617
|
+
Examples
|
618
|
+
--------
|
619
|
+
>>> import numpy as np
|
620
|
+
>>> from scipy.stats import hypergeom
|
621
|
+
>>> import matplotlib.pyplot as plt
|
622
|
+
|
623
|
+
Suppose we have a collection of 20 animals, of which 7 are dogs. Then if
|
624
|
+
we want to know the probability of finding a given number of dogs if we
|
625
|
+
choose at random 12 of the 20 animals, we can initialize a frozen
|
626
|
+
distribution and plot the probability mass function:
|
627
|
+
|
628
|
+
>>> [M, n, N] = [20, 7, 12]
|
629
|
+
>>> rv = hypergeom(M, n, N)
|
630
|
+
>>> x = np.arange(0, n+1)
|
631
|
+
>>> pmf_dogs = rv.pmf(x)
|
632
|
+
|
633
|
+
>>> fig = plt.figure()
|
634
|
+
>>> ax = fig.add_subplot(111)
|
635
|
+
>>> ax.plot(x, pmf_dogs, 'bo')
|
636
|
+
>>> ax.vlines(x, 0, pmf_dogs, lw=2)
|
637
|
+
>>> ax.set_xlabel('# of dogs in our group of chosen animals')
|
638
|
+
>>> ax.set_ylabel('hypergeom PMF')
|
639
|
+
>>> plt.show()
|
640
|
+
|
641
|
+
Instead of using a frozen distribution we can also use `hypergeom`
|
642
|
+
methods directly. To for example obtain the cumulative distribution
|
643
|
+
function, use:
|
644
|
+
|
645
|
+
>>> prb = hypergeom.cdf(x, M, n, N)
|
646
|
+
|
647
|
+
And to generate random numbers:
|
648
|
+
|
649
|
+
>>> R = hypergeom.rvs(M, n, N, size=10)
|
650
|
+
|
651
|
+
See Also
|
652
|
+
--------
|
653
|
+
nhypergeom, binom, nbinom
|
654
|
+
|
655
|
+
"""
|
656
|
+
def _shape_info(self):
|
657
|
+
return [_ShapeInfo("M", True, (0, np.inf), (True, False)),
|
658
|
+
_ShapeInfo("n", True, (0, np.inf), (True, False)),
|
659
|
+
_ShapeInfo("N", True, (0, np.inf), (True, False))]
|
660
|
+
|
661
|
+
def _rvs(self, M, n, N, size=None, random_state=None):
|
662
|
+
return random_state.hypergeometric(n, M-n, N, size=size)
|
663
|
+
|
664
|
+
def _get_support(self, M, n, N):
|
665
|
+
return np.maximum(N-(M-n), 0), np.minimum(n, N)
|
666
|
+
|
667
|
+
def _argcheck(self, M, n, N):
|
668
|
+
cond = (M > 0) & (n >= 0) & (N >= 0)
|
669
|
+
cond &= (n <= M) & (N <= M)
|
670
|
+
cond &= _isintegral(M) & _isintegral(n) & _isintegral(N)
|
671
|
+
return cond
|
672
|
+
|
673
|
+
def _logpmf(self, k, M, n, N):
|
674
|
+
tot, good = M, n
|
675
|
+
bad = tot - good
|
676
|
+
result = (betaln(good+1, 1) + betaln(bad+1, 1) + betaln(tot-N+1, N+1) -
|
677
|
+
betaln(k+1, good-k+1) - betaln(N-k+1, bad-N+k+1) -
|
678
|
+
betaln(tot+1, 1))
|
679
|
+
return result
|
680
|
+
|
681
|
+
def _pmf(self, k, M, n, N):
|
682
|
+
return scu._hypergeom_pmf(k, n, N, M)
|
683
|
+
|
684
|
+
def _cdf(self, k, M, n, N):
|
685
|
+
return scu._hypergeom_cdf(k, n, N, M)
|
686
|
+
|
687
|
+
def _stats(self, M, n, N):
|
688
|
+
M, n, N = 1. * M, 1. * n, 1. * N
|
689
|
+
m = M - n
|
690
|
+
|
691
|
+
# Boost kurtosis_excess doesn't return the same as the value
|
692
|
+
# computed here.
|
693
|
+
g2 = M * (M + 1) - 6. * N * (M - N) - 6. * n * m
|
694
|
+
g2 *= (M - 1) * M * M
|
695
|
+
g2 += 6. * n * N * (M - N) * m * (5. * M - 6)
|
696
|
+
g2 /= n * N * (M - N) * m * (M - 2.) * (M - 3.)
|
697
|
+
return (
|
698
|
+
scu._hypergeom_mean(n, N, M),
|
699
|
+
scu._hypergeom_variance(n, N, M),
|
700
|
+
scu._hypergeom_skewness(n, N, M),
|
701
|
+
g2,
|
702
|
+
)
|
703
|
+
|
704
|
+
def _entropy(self, M, n, N):
|
705
|
+
k = np.r_[N - (M - n):min(n, N) + 1]
|
706
|
+
vals = self.pmf(k, M, n, N)
|
707
|
+
return np.sum(entr(vals), axis=0)
|
708
|
+
|
709
|
+
def _sf(self, k, M, n, N):
|
710
|
+
return scu._hypergeom_sf(k, n, N, M)
|
711
|
+
|
712
|
+
def _logsf(self, k, M, n, N):
|
713
|
+
res = []
|
714
|
+
for quant, tot, good, draw in zip(*np.broadcast_arrays(k, M, n, N)):
|
715
|
+
if (quant + 0.5) * (tot + 0.5) < (good - 0.5) * (draw - 0.5):
|
716
|
+
# Less terms to sum if we calculate log(1-cdf)
|
717
|
+
res.append(log1p(-exp(self.logcdf(quant, tot, good, draw))))
|
718
|
+
else:
|
719
|
+
# Integration over probability mass function using logsumexp
|
720
|
+
k2 = np.arange(quant + 1, draw + 1)
|
721
|
+
res.append(logsumexp(self._logpmf(k2, tot, good, draw)))
|
722
|
+
return np.asarray(res)
|
723
|
+
|
724
|
+
def _logcdf(self, k, M, n, N):
|
725
|
+
res = []
|
726
|
+
for quant, tot, good, draw in zip(*np.broadcast_arrays(k, M, n, N)):
|
727
|
+
if (quant + 0.5) * (tot + 0.5) > (good - 0.5) * (draw - 0.5):
|
728
|
+
# Less terms to sum if we calculate log(1-sf)
|
729
|
+
res.append(log1p(-exp(self.logsf(quant, tot, good, draw))))
|
730
|
+
else:
|
731
|
+
# Integration over probability mass function using logsumexp
|
732
|
+
k2 = np.arange(0, quant + 1)
|
733
|
+
res.append(logsumexp(self._logpmf(k2, tot, good, draw)))
|
734
|
+
return np.asarray(res)
|
735
|
+
|
736
|
+
|
737
|
+
hypergeom = hypergeom_gen(name='hypergeom')
|
738
|
+
|
739
|
+
|
740
|
+
class nhypergeom_gen(rv_discrete):
|
741
|
+
r"""A negative hypergeometric discrete random variable.
|
742
|
+
|
743
|
+
Consider a box containing :math:`M` balls:, :math:`n` red and
|
744
|
+
:math:`M-n` blue. We randomly sample balls from the box, one
|
745
|
+
at a time and *without* replacement, until we have picked :math:`r`
|
746
|
+
blue balls. `nhypergeom` is the distribution of the number of
|
747
|
+
red balls :math:`k` we have picked.
|
748
|
+
|
749
|
+
%(before_notes)s
|
750
|
+
|
751
|
+
Notes
|
752
|
+
-----
|
753
|
+
The symbols used to denote the shape parameters (`M`, `n`, and `r`) are not
|
754
|
+
universally accepted. See the Examples for a clarification of the
|
755
|
+
definitions used here.
|
756
|
+
|
757
|
+
The probability mass function is defined as,
|
758
|
+
|
759
|
+
.. math:: f(k; M, n, r) = \frac{{{k+r-1}\choose{k}}{{M-r-k}\choose{n-k}}}
|
760
|
+
{{M \choose n}}
|
761
|
+
|
762
|
+
for :math:`k \in [0, n]`, :math:`n \in [0, M]`, :math:`r \in [0, M-n]`,
|
763
|
+
and the binomial coefficient is:
|
764
|
+
|
765
|
+
.. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
|
766
|
+
|
767
|
+
It is equivalent to observing :math:`k` successes in :math:`k+r-1`
|
768
|
+
samples with :math:`k+r`'th sample being a failure. The former
|
769
|
+
can be modelled as a hypergeometric distribution. The probability
|
770
|
+
of the latter is simply the number of failures remaining
|
771
|
+
:math:`M-n-(r-1)` divided by the size of the remaining population
|
772
|
+
:math:`M-(k+r-1)`. This relationship can be shown as:
|
773
|
+
|
774
|
+
.. math:: NHG(k;M,n,r) = HG(k;M,n,k+r-1)\frac{(M-n-(r-1))}{(M-(k+r-1))}
|
775
|
+
|
776
|
+
where :math:`NHG` is probability mass function (PMF) of the
|
777
|
+
negative hypergeometric distribution and :math:`HG` is the
|
778
|
+
PMF of the hypergeometric distribution.
|
779
|
+
|
780
|
+
%(after_notes)s
|
781
|
+
|
782
|
+
Examples
|
783
|
+
--------
|
784
|
+
>>> import numpy as np
|
785
|
+
>>> from scipy.stats import nhypergeom
|
786
|
+
>>> import matplotlib.pyplot as plt
|
787
|
+
|
788
|
+
Suppose we have a collection of 20 animals, of which 7 are dogs.
|
789
|
+
Then if we want to know the probability of finding a given number
|
790
|
+
of dogs (successes) in a sample with exactly 12 animals that
|
791
|
+
aren't dogs (failures), we can initialize a frozen distribution
|
792
|
+
and plot the probability mass function:
|
793
|
+
|
794
|
+
>>> M, n, r = [20, 7, 12]
|
795
|
+
>>> rv = nhypergeom(M, n, r)
|
796
|
+
>>> x = np.arange(0, n+2)
|
797
|
+
>>> pmf_dogs = rv.pmf(x)
|
798
|
+
|
799
|
+
>>> fig = plt.figure()
|
800
|
+
>>> ax = fig.add_subplot(111)
|
801
|
+
>>> ax.plot(x, pmf_dogs, 'bo')
|
802
|
+
>>> ax.vlines(x, 0, pmf_dogs, lw=2)
|
803
|
+
>>> ax.set_xlabel('# of dogs in our group with given 12 failures')
|
804
|
+
>>> ax.set_ylabel('nhypergeom PMF')
|
805
|
+
>>> plt.show()
|
806
|
+
|
807
|
+
Instead of using a frozen distribution we can also use `nhypergeom`
|
808
|
+
methods directly. To for example obtain the probability mass
|
809
|
+
function, use:
|
810
|
+
|
811
|
+
>>> prb = nhypergeom.pmf(x, M, n, r)
|
812
|
+
|
813
|
+
And to generate random numbers:
|
814
|
+
|
815
|
+
>>> R = nhypergeom.rvs(M, n, r, size=10)
|
816
|
+
|
817
|
+
To verify the relationship between `hypergeom` and `nhypergeom`, use:
|
818
|
+
|
819
|
+
>>> from scipy.stats import hypergeom, nhypergeom
|
820
|
+
>>> M, n, r = 45, 13, 8
|
821
|
+
>>> k = 6
|
822
|
+
>>> nhypergeom.pmf(k, M, n, r)
|
823
|
+
0.06180776620271643
|
824
|
+
>>> hypergeom.pmf(k, M, n, k+r-1) * (M - n - (r-1)) / (M - (k+r-1))
|
825
|
+
0.06180776620271644
|
826
|
+
|
827
|
+
See Also
|
828
|
+
--------
|
829
|
+
hypergeom, binom, nbinom
|
830
|
+
|
831
|
+
References
|
832
|
+
----------
|
833
|
+
.. [1] Negative Hypergeometric Distribution on Wikipedia
|
834
|
+
https://en.wikipedia.org/wiki/Negative_hypergeometric_distribution
|
835
|
+
|
836
|
+
.. [2] Negative Hypergeometric Distribution from
|
837
|
+
http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Negativehypergeometric.pdf
|
838
|
+
|
839
|
+
"""
|
840
|
+
|
841
|
+
def _shape_info(self):
|
842
|
+
return [_ShapeInfo("M", True, (0, np.inf), (True, False)),
|
843
|
+
_ShapeInfo("n", True, (0, np.inf), (True, False)),
|
844
|
+
_ShapeInfo("r", True, (0, np.inf), (True, False))]
|
845
|
+
|
846
|
+
def _get_support(self, M, n, r):
|
847
|
+
return 0, n
|
848
|
+
|
849
|
+
def _argcheck(self, M, n, r):
|
850
|
+
cond = (n >= 0) & (n <= M) & (r >= 0) & (r <= M-n)
|
851
|
+
cond &= _isintegral(M) & _isintegral(n) & _isintegral(r)
|
852
|
+
return cond
|
853
|
+
|
854
|
+
def _rvs(self, M, n, r, size=None, random_state=None):
|
855
|
+
|
856
|
+
@_vectorize_rvs_over_shapes
|
857
|
+
def _rvs1(M, n, r, size, random_state):
|
858
|
+
# invert cdf by calculating all values in support, scalar M, n, r
|
859
|
+
a, b = self.support(M, n, r)
|
860
|
+
ks = np.arange(a, b+1)
|
861
|
+
cdf = self.cdf(ks, M, n, r)
|
862
|
+
ppf = interp1d(cdf, ks, kind='next', fill_value='extrapolate')
|
863
|
+
rvs = ppf(random_state.uniform(size=size)).astype(int)
|
864
|
+
if size is None:
|
865
|
+
return rvs.item()
|
866
|
+
return rvs
|
867
|
+
|
868
|
+
return _rvs1(M, n, r, size=size, random_state=random_state)
|
869
|
+
|
870
|
+
def _logpmf(self, k, M, n, r):
|
871
|
+
return xpx.apply_where(
|
872
|
+
(r != 0) | (k != 0), (k, M, n, r),
|
873
|
+
lambda k, M, n, r:
|
874
|
+
(-betaln(k+1, r) + betaln(k+r, 1)
|
875
|
+
- betaln(n-k+1, M-r-n+1) + betaln(M-r-k+1, 1)
|
876
|
+
+ betaln(n+1, M-n+1) - betaln(M+1, 1)),
|
877
|
+
fill_value=0.0)
|
878
|
+
|
879
|
+
def _pmf(self, k, M, n, r):
|
880
|
+
# same as the following but numerically more precise
|
881
|
+
# return comb(k+r-1, k) * comb(M-r-k, n-k) / comb(M, n)
|
882
|
+
return exp(self._logpmf(k, M, n, r))
|
883
|
+
|
884
|
+
def _stats(self, M, n, r):
|
885
|
+
# Promote the datatype to at least float
|
886
|
+
# mu = rn / (M-n+1)
|
887
|
+
M, n, r = 1.*M, 1.*n, 1.*r
|
888
|
+
mu = r*n / (M-n+1)
|
889
|
+
|
890
|
+
var = r*(M+1)*n / ((M-n+1)*(M-n+2)) * (1 - r / (M-n+1))
|
891
|
+
|
892
|
+
# The skew and kurtosis are mathematically
|
893
|
+
# intractable so return `None`. See [2]_.
|
894
|
+
g1, g2 = None, None
|
895
|
+
return mu, var, g1, g2
|
896
|
+
|
897
|
+
|
898
|
+
nhypergeom = nhypergeom_gen(name='nhypergeom')
|
899
|
+
|
900
|
+
|
901
|
+
# FIXME: Fails _cdfvec
|
902
|
+
class logser_gen(rv_discrete):
|
903
|
+
r"""A Logarithmic (Log-Series, Series) discrete random variable.
|
904
|
+
|
905
|
+
%(before_notes)s
|
906
|
+
|
907
|
+
Notes
|
908
|
+
-----
|
909
|
+
The probability mass function for `logser` is:
|
910
|
+
|
911
|
+
.. math::
|
912
|
+
|
913
|
+
f(k) = - \frac{p^k}{k \log(1-p)}
|
914
|
+
|
915
|
+
for :math:`k \ge 1`, :math:`0 < p < 1`
|
916
|
+
|
917
|
+
`logser` takes :math:`p` as shape parameter,
|
918
|
+
where :math:`p` is the probability of a single success
|
919
|
+
and :math:`1-p` is the probability of a single failure.
|
920
|
+
|
921
|
+
%(after_notes)s
|
922
|
+
|
923
|
+
%(example)s
|
924
|
+
|
925
|
+
"""
|
926
|
+
|
927
|
+
def _shape_info(self):
|
928
|
+
return [_ShapeInfo("p", False, (0, 1), (True, True))]
|
929
|
+
|
930
|
+
def _rvs(self, p, size=None, random_state=None):
|
931
|
+
# looks wrong for p>0.5, too few k=1
|
932
|
+
# trying to use generic is worse, no k=1 at all
|
933
|
+
return random_state.logseries(p, size=size)
|
934
|
+
|
935
|
+
def _argcheck(self, p):
|
936
|
+
return (p > 0) & (p < 1)
|
937
|
+
|
938
|
+
def _pmf(self, k, p):
|
939
|
+
# logser.pmf(k) = - p**k / (k*log(1-p))
|
940
|
+
return -np.power(p, k) * 1.0 / k / special.log1p(-p)
|
941
|
+
|
942
|
+
def _stats(self, p):
|
943
|
+
r = special.log1p(-p)
|
944
|
+
mu = p / (p - 1.0) / r
|
945
|
+
mu2p = -p / r / (p - 1.0)**2
|
946
|
+
var = mu2p - mu*mu
|
947
|
+
mu3p = -p / r * (1.0+p) / (1.0 - p)**3
|
948
|
+
mu3 = mu3p - 3*mu*mu2p + 2*mu**3
|
949
|
+
g1 = mu3 / np.power(var, 1.5)
|
950
|
+
|
951
|
+
mu4p = -p / r * (
|
952
|
+
1.0 / (p-1)**2 - 6*p / (p - 1)**3 + 6*p*p / (p-1)**4)
|
953
|
+
mu4 = mu4p - 4*mu3p*mu + 6*mu2p*mu*mu - 3*mu**4
|
954
|
+
g2 = mu4 / var**2 - 3.0
|
955
|
+
return mu, var, g1, g2
|
956
|
+
|
957
|
+
|
958
|
+
logser = logser_gen(a=1, name='logser', longname='A logarithmic')
|
959
|
+
|
960
|
+
|
961
|
+
class poisson_gen(rv_discrete):
|
962
|
+
r"""A Poisson discrete random variable.
|
963
|
+
|
964
|
+
%(before_notes)s
|
965
|
+
|
966
|
+
Notes
|
967
|
+
-----
|
968
|
+
The probability mass function for `poisson` is:
|
969
|
+
|
970
|
+
.. math::
|
971
|
+
|
972
|
+
f(k) = \exp(-\mu) \frac{\mu^k}{k!}
|
973
|
+
|
974
|
+
for :math:`k \ge 0`.
|
975
|
+
|
976
|
+
`poisson` takes :math:`\mu \geq 0` as shape parameter.
|
977
|
+
When :math:`\mu = 0`, the ``pmf`` method
|
978
|
+
returns ``1.0`` at quantile :math:`k = 0`.
|
979
|
+
|
980
|
+
%(after_notes)s
|
981
|
+
|
982
|
+
%(example)s
|
983
|
+
|
984
|
+
"""
|
985
|
+
|
986
|
+
def _shape_info(self):
|
987
|
+
return [_ShapeInfo("mu", False, (0, np.inf), (True, False))]
|
988
|
+
|
989
|
+
# Override rv_discrete._argcheck to allow mu=0.
|
990
|
+
def _argcheck(self, mu):
|
991
|
+
return mu >= 0
|
992
|
+
|
993
|
+
def _rvs(self, mu, size=None, random_state=None):
|
994
|
+
return random_state.poisson(mu, size)
|
995
|
+
|
996
|
+
def _logpmf(self, k, mu):
|
997
|
+
Pk = special.xlogy(k, mu) - gamln(k + 1) - mu
|
998
|
+
return Pk
|
999
|
+
|
1000
|
+
def _pmf(self, k, mu):
|
1001
|
+
# poisson.pmf(k) = exp(-mu) * mu**k / k!
|
1002
|
+
return exp(self._logpmf(k, mu))
|
1003
|
+
|
1004
|
+
def _cdf(self, x, mu):
|
1005
|
+
k = floor(x)
|
1006
|
+
return special.pdtr(k, mu)
|
1007
|
+
|
1008
|
+
def _sf(self, x, mu):
|
1009
|
+
k = floor(x)
|
1010
|
+
return special.pdtrc(k, mu)
|
1011
|
+
|
1012
|
+
def _ppf(self, q, mu):
|
1013
|
+
vals = ceil(special.pdtrik(q, mu))
|
1014
|
+
vals1 = np.maximum(vals - 1, 0)
|
1015
|
+
temp = special.pdtr(vals1, mu)
|
1016
|
+
return np.where(temp >= q, vals1, vals)
|
1017
|
+
|
1018
|
+
def _stats(self, mu):
|
1019
|
+
var = mu
|
1020
|
+
tmp = np.asarray(mu)
|
1021
|
+
mu_nonzero = tmp > 0
|
1022
|
+
g1 = xpx.apply_where(mu_nonzero, tmp, lambda x: sqrt(1.0/x), fill_value=np.inf)
|
1023
|
+
g2 = xpx.apply_where(mu_nonzero, tmp, lambda x: 1.0/x, fill_value=np.inf)
|
1024
|
+
return mu, var, g1, g2
|
1025
|
+
|
1026
|
+
|
1027
|
+
poisson = poisson_gen(name="poisson", longname='A Poisson')
|
1028
|
+
|
1029
|
+
|
1030
|
+
class planck_gen(rv_discrete):
|
1031
|
+
r"""A Planck discrete exponential random variable.
|
1032
|
+
|
1033
|
+
%(before_notes)s
|
1034
|
+
|
1035
|
+
Notes
|
1036
|
+
-----
|
1037
|
+
The probability mass function for `planck` is:
|
1038
|
+
|
1039
|
+
.. math::
|
1040
|
+
|
1041
|
+
f(k) = (1-\exp(-\lambda)) \exp(-\lambda k)
|
1042
|
+
|
1043
|
+
for :math:`k \ge 0` and :math:`\lambda > 0`.
|
1044
|
+
|
1045
|
+
`planck` takes :math:`\lambda` as shape parameter. The Planck distribution
|
1046
|
+
can be written as a geometric distribution (`geom`) with
|
1047
|
+
:math:`p = 1 - \exp(-\lambda)` shifted by ``loc = -1``.
|
1048
|
+
|
1049
|
+
%(after_notes)s
|
1050
|
+
|
1051
|
+
See Also
|
1052
|
+
--------
|
1053
|
+
geom
|
1054
|
+
|
1055
|
+
%(example)s
|
1056
|
+
|
1057
|
+
"""
|
1058
|
+
def _shape_info(self):
|
1059
|
+
return [_ShapeInfo("lambda_", False, (0, np.inf), (False, False))]
|
1060
|
+
|
1061
|
+
def _argcheck(self, lambda_):
|
1062
|
+
return lambda_ > 0
|
1063
|
+
|
1064
|
+
def _pmf(self, k, lambda_):
|
1065
|
+
return -expm1(-lambda_)*exp(-lambda_*k)
|
1066
|
+
|
1067
|
+
def _cdf(self, x, lambda_):
|
1068
|
+
k = floor(x)
|
1069
|
+
return -expm1(-lambda_*(k+1))
|
1070
|
+
|
1071
|
+
def _sf(self, x, lambda_):
|
1072
|
+
return exp(self._logsf(x, lambda_))
|
1073
|
+
|
1074
|
+
def _logsf(self, x, lambda_):
|
1075
|
+
k = floor(x)
|
1076
|
+
return -lambda_*(k+1)
|
1077
|
+
|
1078
|
+
def _ppf(self, q, lambda_):
|
1079
|
+
vals = ceil(-1.0/lambda_ * log1p(-q)-1)
|
1080
|
+
vals1 = (vals-1).clip(*(self._get_support(lambda_)))
|
1081
|
+
temp = self._cdf(vals1, lambda_)
|
1082
|
+
return np.where(temp >= q, vals1, vals)
|
1083
|
+
|
1084
|
+
def _rvs(self, lambda_, size=None, random_state=None):
|
1085
|
+
# use relation to geometric distribution for sampling
|
1086
|
+
p = -expm1(-lambda_)
|
1087
|
+
return random_state.geometric(p, size=size) - 1.0
|
1088
|
+
|
1089
|
+
def _stats(self, lambda_):
|
1090
|
+
mu = 1/expm1(lambda_)
|
1091
|
+
var = exp(-lambda_)/(expm1(-lambda_))**2
|
1092
|
+
g1 = 2*cosh(lambda_/2.0)
|
1093
|
+
g2 = 4+2*cosh(lambda_)
|
1094
|
+
return mu, var, g1, g2
|
1095
|
+
|
1096
|
+
def _entropy(self, lambda_):
|
1097
|
+
C = -expm1(-lambda_)
|
1098
|
+
return lambda_*exp(-lambda_)/C - log(C)
|
1099
|
+
|
1100
|
+
|
1101
|
+
planck = planck_gen(a=0, name='planck', longname='A discrete exponential ')
|
1102
|
+
|
1103
|
+
|
1104
|
+
class boltzmann_gen(rv_discrete):
|
1105
|
+
r"""A Boltzmann (Truncated Discrete Exponential) random variable.
|
1106
|
+
|
1107
|
+
%(before_notes)s
|
1108
|
+
|
1109
|
+
Notes
|
1110
|
+
-----
|
1111
|
+
The probability mass function for `boltzmann` is:
|
1112
|
+
|
1113
|
+
.. math::
|
1114
|
+
|
1115
|
+
f(k) = (1-\exp(-\lambda)) \exp(-\lambda k) / (1-\exp(-\lambda N))
|
1116
|
+
|
1117
|
+
for :math:`k = 0,..., N-1`.
|
1118
|
+
|
1119
|
+
`boltzmann` takes :math:`\lambda > 0` and :math:`N > 0` as shape parameters.
|
1120
|
+
|
1121
|
+
%(after_notes)s
|
1122
|
+
|
1123
|
+
%(example)s
|
1124
|
+
|
1125
|
+
"""
|
1126
|
+
def _shape_info(self):
|
1127
|
+
return [_ShapeInfo("lambda_", False, (0, np.inf), (False, False)),
|
1128
|
+
_ShapeInfo("N", True, (0, np.inf), (False, False))]
|
1129
|
+
|
1130
|
+
def _argcheck(self, lambda_, N):
|
1131
|
+
return (lambda_ > 0) & (N > 0) & _isintegral(N)
|
1132
|
+
|
1133
|
+
def _get_support(self, lambda_, N):
|
1134
|
+
return self.a, N - 1
|
1135
|
+
|
1136
|
+
def _pmf(self, k, lambda_, N):
|
1137
|
+
# boltzmann.pmf(k) =
|
1138
|
+
# (1-exp(-lambda_)*exp(-lambda_*k)/(1-exp(-lambda_*N))
|
1139
|
+
fact = (1-exp(-lambda_))/(1-exp(-lambda_*N))
|
1140
|
+
return fact*exp(-lambda_*k)
|
1141
|
+
|
1142
|
+
def _cdf(self, x, lambda_, N):
|
1143
|
+
k = floor(x)
|
1144
|
+
return (1-exp(-lambda_*(k+1)))/(1-exp(-lambda_*N))
|
1145
|
+
|
1146
|
+
def _ppf(self, q, lambda_, N):
|
1147
|
+
qnew = q*(1-exp(-lambda_*N))
|
1148
|
+
vals = ceil(-1.0/lambda_ * log(1-qnew)-1)
|
1149
|
+
vals1 = (vals-1).clip(0.0, np.inf)
|
1150
|
+
temp = self._cdf(vals1, lambda_, N)
|
1151
|
+
return np.where(temp >= q, vals1, vals)
|
1152
|
+
|
1153
|
+
def _stats(self, lambda_, N):
|
1154
|
+
z = exp(-lambda_)
|
1155
|
+
zN = exp(-lambda_*N)
|
1156
|
+
mu = z/(1.0-z)-N*zN/(1-zN)
|
1157
|
+
var = z/(1.0-z)**2 - N*N*zN/(1-zN)**2
|
1158
|
+
trm = (1-zN)/(1-z)
|
1159
|
+
trm2 = (z*trm**2 - N*N*zN)
|
1160
|
+
g1 = z*(1+z)*trm**3 - N**3*zN*(1+zN)
|
1161
|
+
g1 = g1 / trm2**(1.5)
|
1162
|
+
g2 = z*(1+4*z+z*z)*trm**4 - N**4 * zN*(1+4*zN+zN*zN)
|
1163
|
+
g2 = g2 / trm2 / trm2
|
1164
|
+
return mu, var, g1, g2
|
1165
|
+
|
1166
|
+
|
1167
|
+
boltzmann = boltzmann_gen(name='boltzmann', a=0,
|
1168
|
+
longname='A truncated discrete exponential ')
|
1169
|
+
|
1170
|
+
|
1171
|
+
class randint_gen(rv_discrete):
|
1172
|
+
r"""A uniform discrete random variable.
|
1173
|
+
|
1174
|
+
%(before_notes)s
|
1175
|
+
|
1176
|
+
Notes
|
1177
|
+
-----
|
1178
|
+
The probability mass function for `randint` is:
|
1179
|
+
|
1180
|
+
.. math::
|
1181
|
+
|
1182
|
+
f(k) = \frac{1}{\texttt{high} - \texttt{low}}
|
1183
|
+
|
1184
|
+
for :math:`k \in \{\texttt{low}, \dots, \texttt{high} - 1\}`.
|
1185
|
+
|
1186
|
+
`randint` takes :math:`\texttt{low}` and :math:`\texttt{high}` as shape
|
1187
|
+
parameters.
|
1188
|
+
|
1189
|
+
%(after_notes)s
|
1190
|
+
|
1191
|
+
Examples
|
1192
|
+
--------
|
1193
|
+
>>> import numpy as np
|
1194
|
+
>>> from scipy.stats import randint
|
1195
|
+
>>> import matplotlib.pyplot as plt
|
1196
|
+
>>> fig, ax = plt.subplots(1, 1)
|
1197
|
+
|
1198
|
+
Calculate the first four moments:
|
1199
|
+
|
1200
|
+
>>> low, high = 7, 31
|
1201
|
+
>>> mean, var, skew, kurt = randint.stats(low, high, moments='mvsk')
|
1202
|
+
|
1203
|
+
Display the probability mass function (``pmf``):
|
1204
|
+
|
1205
|
+
>>> x = np.arange(low - 5, high + 5)
|
1206
|
+
>>> ax.plot(x, randint.pmf(x, low, high), 'bo', ms=8, label='randint pmf')
|
1207
|
+
>>> ax.vlines(x, 0, randint.pmf(x, low, high), colors='b', lw=5, alpha=0.5)
|
1208
|
+
|
1209
|
+
Alternatively, the distribution object can be called (as a function) to
|
1210
|
+
fix the shape and location. This returns a "frozen" RV object holding the
|
1211
|
+
given parameters fixed.
|
1212
|
+
|
1213
|
+
Freeze the distribution and display the frozen ``pmf``:
|
1214
|
+
|
1215
|
+
>>> rv = randint(low, high)
|
1216
|
+
>>> ax.vlines(x, 0, rv.pmf(x), colors='k', linestyles='-',
|
1217
|
+
... lw=1, label='frozen pmf')
|
1218
|
+
>>> ax.legend(loc='lower center')
|
1219
|
+
>>> plt.show()
|
1220
|
+
|
1221
|
+
Check the relationship between the cumulative distribution function
|
1222
|
+
(``cdf``) and its inverse, the percent point function (``ppf``):
|
1223
|
+
|
1224
|
+
>>> q = np.arange(low, high)
|
1225
|
+
>>> p = randint.cdf(q, low, high)
|
1226
|
+
>>> np.allclose(q, randint.ppf(p, low, high))
|
1227
|
+
True
|
1228
|
+
|
1229
|
+
Generate random numbers:
|
1230
|
+
|
1231
|
+
>>> r = randint.rvs(low, high, size=1000)
|
1232
|
+
|
1233
|
+
"""
|
1234
|
+
|
1235
|
+
def _shape_info(self):
|
1236
|
+
return [_ShapeInfo("low", True, (-np.inf, np.inf), (False, False)),
|
1237
|
+
_ShapeInfo("high", True, (-np.inf, np.inf), (False, False))]
|
1238
|
+
|
1239
|
+
def _argcheck(self, low, high):
|
1240
|
+
return (high > low) & _isintegral(low) & _isintegral(high)
|
1241
|
+
|
1242
|
+
def _get_support(self, low, high):
|
1243
|
+
return low, high-1
|
1244
|
+
|
1245
|
+
def _pmf(self, k, low, high):
|
1246
|
+
# randint.pmf(k) = 1./(high - low)
|
1247
|
+
p = np.ones_like(k) / (np.asarray(high, dtype=np.int64) - low)
|
1248
|
+
return np.where((k >= low) & (k < high), p, 0.)
|
1249
|
+
|
1250
|
+
def _cdf(self, x, low, high):
|
1251
|
+
k = floor(x)
|
1252
|
+
return (k - low + 1.) / (high - low)
|
1253
|
+
|
1254
|
+
def _ppf(self, q, low, high):
|
1255
|
+
vals = ceil(q * (high - low) + low) - 1
|
1256
|
+
vals1 = (vals - 1).clip(low, high)
|
1257
|
+
temp = self._cdf(vals1, low, high)
|
1258
|
+
return np.where(temp >= q, vals1, vals)
|
1259
|
+
|
1260
|
+
def _stats(self, low, high):
|
1261
|
+
m2, m1 = np.asarray(high), np.asarray(low)
|
1262
|
+
mu = (m2 + m1 - 1.0) / 2
|
1263
|
+
d = m2 - m1
|
1264
|
+
var = (d*d - 1) / 12.0
|
1265
|
+
g1 = 0.0
|
1266
|
+
g2 = -6.0/5.0 * (d*d + 1.0) / (d*d - 1.0)
|
1267
|
+
return mu, var, g1, g2
|
1268
|
+
|
1269
|
+
def _rvs(self, low, high, size=None, random_state=None):
|
1270
|
+
"""An array of *size* random integers >= ``low`` and < ``high``."""
|
1271
|
+
if np.asarray(low).size == 1 and np.asarray(high).size == 1:
|
1272
|
+
# no need to vectorize in that case
|
1273
|
+
return rng_integers(random_state, low, high, size=size)
|
1274
|
+
|
1275
|
+
if size is not None:
|
1276
|
+
# NumPy's RandomState.randint() doesn't broadcast its arguments.
|
1277
|
+
# Use `broadcast_to()` to extend the shapes of low and high
|
1278
|
+
# up to size. Then we can use the numpy.vectorize'd
|
1279
|
+
# randint without needing to pass it a `size` argument.
|
1280
|
+
low = np.broadcast_to(low, size)
|
1281
|
+
high = np.broadcast_to(high, size)
|
1282
|
+
randint = np.vectorize(partial(rng_integers, random_state),
|
1283
|
+
otypes=[np.dtype(int)])
|
1284
|
+
return randint(low, high)
|
1285
|
+
|
1286
|
+
def _entropy(self, low, high):
|
1287
|
+
return log(high - low)
|
1288
|
+
|
1289
|
+
|
1290
|
+
randint = randint_gen(name='randint', longname='A discrete uniform '
|
1291
|
+
'(random integer)')
|
1292
|
+
|
1293
|
+
|
1294
|
+
# FIXME: problems sampling.
|
1295
|
+
class zipf_gen(rv_discrete):
|
1296
|
+
r"""A Zipf (Zeta) discrete random variable.
|
1297
|
+
|
1298
|
+
%(before_notes)s
|
1299
|
+
|
1300
|
+
See Also
|
1301
|
+
--------
|
1302
|
+
zipfian
|
1303
|
+
|
1304
|
+
Notes
|
1305
|
+
-----
|
1306
|
+
The probability mass function for `zipf` is:
|
1307
|
+
|
1308
|
+
.. math::
|
1309
|
+
|
1310
|
+
f(k, a) = \frac{1}{\zeta(a) k^a}
|
1311
|
+
|
1312
|
+
for :math:`k \ge 1`, :math:`a > 1`.
|
1313
|
+
|
1314
|
+
`zipf` takes :math:`a > 1` as shape parameter. :math:`\zeta` is the
|
1315
|
+
Riemann zeta function (`scipy.special.zeta`)
|
1316
|
+
|
1317
|
+
The Zipf distribution is also known as the zeta distribution, which is
|
1318
|
+
a special case of the Zipfian distribution (`zipfian`).
|
1319
|
+
|
1320
|
+
%(after_notes)s
|
1321
|
+
|
1322
|
+
References
|
1323
|
+
----------
|
1324
|
+
.. [1] "Zeta Distribution", Wikipedia,
|
1325
|
+
https://en.wikipedia.org/wiki/Zeta_distribution
|
1326
|
+
|
1327
|
+
%(example)s
|
1328
|
+
|
1329
|
+
Confirm that `zipf` is the large `n` limit of `zipfian`.
|
1330
|
+
|
1331
|
+
>>> import numpy as np
|
1332
|
+
>>> from scipy.stats import zipf, zipfian
|
1333
|
+
>>> k = np.arange(11)
|
1334
|
+
>>> np.allclose(zipf.pmf(k, a), zipfian.pmf(k, a, n=10000000))
|
1335
|
+
True
|
1336
|
+
|
1337
|
+
"""
|
1338
|
+
|
1339
|
+
def _shape_info(self):
|
1340
|
+
return [_ShapeInfo("a", False, (1, np.inf), (False, False))]
|
1341
|
+
|
1342
|
+
def _rvs(self, a, size=None, random_state=None):
|
1343
|
+
return random_state.zipf(a, size=size)
|
1344
|
+
|
1345
|
+
def _argcheck(self, a):
|
1346
|
+
return a > 1
|
1347
|
+
|
1348
|
+
def _pmf(self, k, a):
|
1349
|
+
k = k.astype(np.float64)
|
1350
|
+
# zipf.pmf(k, a) = 1/(zeta(a) * k**a)
|
1351
|
+
Pk = 1.0 / special.zeta(a, 1) * k**-a
|
1352
|
+
return Pk
|
1353
|
+
|
1354
|
+
def _munp(self, n, a):
|
1355
|
+
return xpx.apply_where(
|
1356
|
+
a > n + 1, (a, n),
|
1357
|
+
lambda a, n: special.zeta(a - n, 1) / special.zeta(a, 1),
|
1358
|
+
fill_value=np.inf)
|
1359
|
+
|
1360
|
+
|
1361
|
+
zipf = zipf_gen(a=1, name='zipf', longname='A Zipf')
|
1362
|
+
|
1363
|
+
|
1364
|
+
def _gen_harmonic_gt1(n, a):
|
1365
|
+
"""Generalized harmonic number, a > 1"""
|
1366
|
+
# See https://en.wikipedia.org/wiki/Harmonic_number; search for "hurwitz"
|
1367
|
+
return zeta(a, 1) - zeta(a, n+1)
|
1368
|
+
|
1369
|
+
|
1370
|
+
def _gen_harmonic_leq1(n, a):
|
1371
|
+
"""Generalized harmonic number, a <= 1"""
|
1372
|
+
if not np.size(n):
|
1373
|
+
return n
|
1374
|
+
n_max = np.nanmax(n) # loop starts at maximum of all n
|
1375
|
+
out = np.zeros_like(a, dtype=float)
|
1376
|
+
# add terms of harmonic series; starting from smallest to avoid roundoff
|
1377
|
+
for i in np.arange(n_max, 0, -1, dtype=float):
|
1378
|
+
mask = i <= n # don't add terms after nth
|
1379
|
+
out[mask] += 1/i**a[mask]
|
1380
|
+
out[np.isnan(n)] = np.nan
|
1381
|
+
return out
|
1382
|
+
|
1383
|
+
|
1384
|
+
def _gen_harmonic(n, a):
|
1385
|
+
"""Generalized harmonic number"""
|
1386
|
+
n, a = np.broadcast_arrays(n, a)
|
1387
|
+
return xpx.apply_where(a > 1, (n, a), _gen_harmonic_gt1, _gen_harmonic_leq1)
|
1388
|
+
|
1389
|
+
|
1390
|
+
class zipfian_gen(rv_discrete):
|
1391
|
+
r"""A Zipfian discrete random variable.
|
1392
|
+
|
1393
|
+
%(before_notes)s
|
1394
|
+
|
1395
|
+
See Also
|
1396
|
+
--------
|
1397
|
+
zipf
|
1398
|
+
|
1399
|
+
Notes
|
1400
|
+
-----
|
1401
|
+
The probability mass function for `zipfian` is:
|
1402
|
+
|
1403
|
+
.. math::
|
1404
|
+
|
1405
|
+
f(k, a, n) = \frac{1}{H_{n,a} k^a}
|
1406
|
+
|
1407
|
+
for :math:`k \in \{1, 2, \dots, n-1, n\}`, :math:`a \ge 0`,
|
1408
|
+
:math:`n \in \{1, 2, 3, \dots\}`.
|
1409
|
+
|
1410
|
+
`zipfian` takes :math:`a` and :math:`n` as shape parameters.
|
1411
|
+
:math:`H_{n,a}` is the :math:`n`:sup:`th` generalized harmonic
|
1412
|
+
number of order :math:`a`.
|
1413
|
+
|
1414
|
+
The Zipfian distribution reduces to the Zipf (zeta) distribution as
|
1415
|
+
:math:`n \rightarrow \infty`.
|
1416
|
+
|
1417
|
+
%(after_notes)s
|
1418
|
+
|
1419
|
+
References
|
1420
|
+
----------
|
1421
|
+
.. [1] "Zipf's Law", Wikipedia, https://en.wikipedia.org/wiki/Zipf's_law
|
1422
|
+
.. [2] Larry Leemis, "Zipf Distribution", Univariate Distribution
|
1423
|
+
Relationships. http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Zipf.pdf
|
1424
|
+
|
1425
|
+
%(example)s
|
1426
|
+
|
1427
|
+
Confirm that `zipfian` reduces to `zipf` for large `n`, ``a > 1``.
|
1428
|
+
|
1429
|
+
>>> import numpy as np
|
1430
|
+
>>> from scipy.stats import zipf, zipfian
|
1431
|
+
>>> k = np.arange(11)
|
1432
|
+
>>> np.allclose(zipfian.pmf(k, a=3.5, n=10000000), zipf.pmf(k, a=3.5))
|
1433
|
+
True
|
1434
|
+
|
1435
|
+
"""
|
1436
|
+
|
1437
|
+
def _shape_info(self):
|
1438
|
+
return [_ShapeInfo("a", False, (0, np.inf), (True, False)),
|
1439
|
+
_ShapeInfo("n", True, (0, np.inf), (False, False))]
|
1440
|
+
|
1441
|
+
def _argcheck(self, a, n):
|
1442
|
+
# we need np.asarray here because moment (maybe others) don't convert
|
1443
|
+
return (a >= 0) & (n > 0) & (n == np.asarray(n, dtype=int))
|
1444
|
+
|
1445
|
+
def _get_support(self, a, n):
|
1446
|
+
return 1, n
|
1447
|
+
|
1448
|
+
def _pmf(self, k, a, n):
|
1449
|
+
k = k.astype(np.float64)
|
1450
|
+
return 1.0 / _gen_harmonic(n, a) * k**-a
|
1451
|
+
|
1452
|
+
def _cdf(self, k, a, n):
|
1453
|
+
k = np.floor(k)
|
1454
|
+
return _gen_harmonic(k, a) / _gen_harmonic(n, a)
|
1455
|
+
|
1456
|
+
def _sf(self, k, a, n):
|
1457
|
+
k = np.floor(k + 1) # # to match SciPy convention
|
1458
|
+
# see http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Zipf.pdf
|
1459
|
+
return ((k**a*(_gen_harmonic(n, a) - _gen_harmonic(k, a)) + 1)
|
1460
|
+
/ (k**a*_gen_harmonic(n, a)))
|
1461
|
+
|
1462
|
+
def _stats(self, a, n):
|
1463
|
+
# see # see http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Zipf.pdf
|
1464
|
+
Hna = _gen_harmonic(n, a)
|
1465
|
+
Hna1 = _gen_harmonic(n, a-1)
|
1466
|
+
Hna2 = _gen_harmonic(n, a-2)
|
1467
|
+
Hna3 = _gen_harmonic(n, a-3)
|
1468
|
+
Hna4 = _gen_harmonic(n, a-4)
|
1469
|
+
mu1 = Hna1/Hna
|
1470
|
+
mu2n = (Hna2*Hna - Hna1**2)
|
1471
|
+
mu2d = Hna**2
|
1472
|
+
mu2 = mu2n / mu2d
|
1473
|
+
g1 = (Hna3/Hna - 3*Hna1*Hna2/Hna**2 + 2*Hna1**3/Hna**3)/mu2**(3/2)
|
1474
|
+
g2 = (Hna**3*Hna4 - 4*Hna**2*Hna1*Hna3 + 6*Hna*Hna1**2*Hna2
|
1475
|
+
- 3*Hna1**4) / mu2n**2
|
1476
|
+
g2 -= 3
|
1477
|
+
return mu1, mu2, g1, g2
|
1478
|
+
|
1479
|
+
|
1480
|
+
zipfian = zipfian_gen(a=1, name='zipfian', longname='A Zipfian')
|
1481
|
+
|
1482
|
+
|
1483
|
+
class dlaplace_gen(rv_discrete):
|
1484
|
+
r"""A Laplacian discrete random variable.
|
1485
|
+
|
1486
|
+
%(before_notes)s
|
1487
|
+
|
1488
|
+
Notes
|
1489
|
+
-----
|
1490
|
+
The probability mass function for `dlaplace` is:
|
1491
|
+
|
1492
|
+
.. math::
|
1493
|
+
|
1494
|
+
f(k) = \tanh(a/2) \exp(-a |k|)
|
1495
|
+
|
1496
|
+
for integers :math:`k` and :math:`a > 0`.
|
1497
|
+
|
1498
|
+
`dlaplace` takes :math:`a` as shape parameter.
|
1499
|
+
|
1500
|
+
%(after_notes)s
|
1501
|
+
|
1502
|
+
%(example)s
|
1503
|
+
|
1504
|
+
"""
|
1505
|
+
|
1506
|
+
def _shape_info(self):
|
1507
|
+
return [_ShapeInfo("a", False, (0, np.inf), (False, False))]
|
1508
|
+
|
1509
|
+
def _pmf(self, k, a):
|
1510
|
+
# dlaplace.pmf(k) = tanh(a/2) * exp(-a*abs(k))
|
1511
|
+
return tanh(a/2.0) * exp(-a * abs(k))
|
1512
|
+
|
1513
|
+
def _cdf(self, x, a):
|
1514
|
+
k = floor(x)
|
1515
|
+
|
1516
|
+
def f1(k, a):
|
1517
|
+
return 1.0 - exp(-a * k) / (exp(a) + 1)
|
1518
|
+
|
1519
|
+
def f2(k, a):
|
1520
|
+
return exp(a * (k + 1)) / (exp(a) + 1)
|
1521
|
+
|
1522
|
+
return xpx.apply_where(k >= 0, (k, a), f1, f2)
|
1523
|
+
|
1524
|
+
def _ppf(self, q, a):
|
1525
|
+
const = 1 + exp(a)
|
1526
|
+
vals = ceil(np.where(q < 1.0 / (1 + exp(-a)),
|
1527
|
+
log(q*const) / a - 1,
|
1528
|
+
-log((1-q) * const) / a))
|
1529
|
+
vals1 = vals - 1
|
1530
|
+
return np.where(self._cdf(vals1, a) >= q, vals1, vals)
|
1531
|
+
|
1532
|
+
def _stats(self, a):
|
1533
|
+
ea = exp(a)
|
1534
|
+
mu2 = 2.*ea/(ea-1.)**2
|
1535
|
+
mu4 = 2.*ea*(ea**2+10.*ea+1.) / (ea-1.)**4
|
1536
|
+
return 0., mu2, 0., mu4/mu2**2 - 3.
|
1537
|
+
|
1538
|
+
def _entropy(self, a):
|
1539
|
+
return a / sinh(a) - log(tanh(a/2.0))
|
1540
|
+
|
1541
|
+
def _rvs(self, a, size=None, random_state=None):
|
1542
|
+
# The discrete Laplace is equivalent to the two-sided geometric
|
1543
|
+
# distribution with PMF:
|
1544
|
+
# f(k) = (1 - alpha)/(1 + alpha) * alpha^abs(k)
|
1545
|
+
# Reference:
|
1546
|
+
# https://www.sciencedirect.com/science/
|
1547
|
+
# article/abs/pii/S0378375804003519
|
1548
|
+
# Furthermore, the two-sided geometric distribution is
|
1549
|
+
# equivalent to the difference between two iid geometric
|
1550
|
+
# distributions.
|
1551
|
+
# Reference (page 179):
|
1552
|
+
# https://pdfs.semanticscholar.org/61b3/
|
1553
|
+
# b99f466815808fd0d03f5d2791eea8b541a1.pdf
|
1554
|
+
# Thus, we can leverage the following:
|
1555
|
+
# 1) alpha = e^-a
|
1556
|
+
# 2) probability_of_success = 1 - alpha (Bernoulli trial)
|
1557
|
+
probOfSuccess = -np.expm1(-np.asarray(a))
|
1558
|
+
x = random_state.geometric(probOfSuccess, size=size)
|
1559
|
+
y = random_state.geometric(probOfSuccess, size=size)
|
1560
|
+
return x - y
|
1561
|
+
|
1562
|
+
|
1563
|
+
dlaplace = dlaplace_gen(a=-np.inf,
|
1564
|
+
name='dlaplace', longname='A discrete Laplacian')
|
1565
|
+
|
1566
|
+
|
1567
|
+
class poisson_binom_gen(rv_discrete):
|
1568
|
+
r"""A Poisson Binomial discrete random variable.
|
1569
|
+
|
1570
|
+
%(before_notes)s
|
1571
|
+
|
1572
|
+
See Also
|
1573
|
+
--------
|
1574
|
+
binom
|
1575
|
+
|
1576
|
+
Notes
|
1577
|
+
-----
|
1578
|
+
The probability mass function for `poisson_binom` is:
|
1579
|
+
|
1580
|
+
.. math::
|
1581
|
+
|
1582
|
+
f(k; p_1, p_2, ..., p_n) = \sum_{A \in F_k} \prod_{i \in A} p_i \prod_{j \in A^C} 1 - p_j
|
1583
|
+
|
1584
|
+
where :math:`k \in \{0, 1, \dots, n-1, n\}`, :math:`F_k` is the set of all
|
1585
|
+
subsets of :math:`k` integers that can be selected :math:`\{0, 1, \dots, n-1, n\}`,
|
1586
|
+
and :math:`A^C` is the complement of a set :math:`A`.
|
1587
|
+
|
1588
|
+
`poisson_binom` accepts a single array argument ``p`` for shape parameters
|
1589
|
+
:math:`0 ≤ p_i ≤ 1`, where the last axis corresponds with the index :math:`i` and
|
1590
|
+
any others are for batch dimensions. Broadcasting behaves according to the usual
|
1591
|
+
rules except that the last axis of ``p`` is ignored. Instances of this class do
|
1592
|
+
not support serialization/unserialization.
|
1593
|
+
|
1594
|
+
%(after_notes)s
|
1595
|
+
|
1596
|
+
References
|
1597
|
+
----------
|
1598
|
+
.. [1] "Poisson binomial distribution", Wikipedia,
|
1599
|
+
https://en.wikipedia.org/wiki/Poisson_binomial_distribution
|
1600
|
+
.. [2] Biscarri, William, Sihai Dave Zhao, and Robert J. Brunner. "A simple and
|
1601
|
+
fast method for computing the Poisson binomial distribution function".
|
1602
|
+
Computational Statistics & Data Analysis 122 (2018) 92-100.
|
1603
|
+
:doi:`10.1016/j.csda.2018.01.007`
|
1604
|
+
|
1605
|
+
%(example)s
|
1606
|
+
|
1607
|
+
""" # noqa: E501
|
1608
|
+
def _shape_info(self):
|
1609
|
+
# message = 'Fitting is not implemented for this distribution."
|
1610
|
+
# raise NotImplementedError(message)
|
1611
|
+
return []
|
1612
|
+
|
1613
|
+
def _argcheck(self, *args):
|
1614
|
+
p = np.stack(args, axis=0)
|
1615
|
+
conds = (0 <= p) & (p <= 1)
|
1616
|
+
return np.all(conds, axis=0)
|
1617
|
+
|
1618
|
+
def _rvs(self, *args, size=None, random_state=None):
|
1619
|
+
# convenient to work along the last axis here to avoid interference with `size`
|
1620
|
+
p = np.stack(args, axis=-1)
|
1621
|
+
# Size passed by the user is the *shape of the returned array*, so it won't
|
1622
|
+
# contain the length of the last axis of p.
|
1623
|
+
size = (p.shape if size is None else
|
1624
|
+
(size, 1) if np.isscalar(size) else tuple(size) + (1,))
|
1625
|
+
size = np.broadcast_shapes(p.shape, size)
|
1626
|
+
return bernoulli._rvs(p, size=size, random_state=random_state).sum(axis=-1)
|
1627
|
+
|
1628
|
+
def _get_support(self, *args):
|
1629
|
+
return 0, len(args)
|
1630
|
+
|
1631
|
+
def _pmf(self, k, *args):
|
1632
|
+
k = np.atleast_1d(k).astype(np.int64)
|
1633
|
+
k, *args = np.broadcast_arrays(k, *args)
|
1634
|
+
args = np.asarray(args, dtype=np.float64)
|
1635
|
+
return _poisson_binom(k, args, 'pmf')
|
1636
|
+
|
1637
|
+
def _cdf(self, k, *args):
|
1638
|
+
k = np.atleast_1d(k).astype(np.int64)
|
1639
|
+
k, *args = np.broadcast_arrays(k, *args)
|
1640
|
+
args = np.asarray(args, dtype=np.float64)
|
1641
|
+
return _poisson_binom(k, args, 'cdf')
|
1642
|
+
|
1643
|
+
def _stats(self, *args, **kwds):
|
1644
|
+
p = np.stack(args, axis=0)
|
1645
|
+
mean = np.sum(p, axis=0)
|
1646
|
+
var = np.sum(p * (1-p), axis=0)
|
1647
|
+
return (mean, var, None, None)
|
1648
|
+
|
1649
|
+
def __call__(self, *args, **kwds):
|
1650
|
+
return poisson_binomial_frozen(self, *args, **kwds)
|
1651
|
+
|
1652
|
+
|
1653
|
+
poisson_binom = poisson_binom_gen(name='poisson_binom', longname='A Poisson binomial',
|
1654
|
+
shapes='p')
|
1655
|
+
|
1656
|
+
# The _parse_args methods don't work with vector-valued shape parameters, so we rewrite
|
1657
|
+
# them. Note that `p` is accepted as an array with the index `i` of `p_i` corresponding
|
1658
|
+
# with the last axis; we return it as a tuple (p_1, p_2, ..., p_n) so that it looks
|
1659
|
+
# like `n` scalar (or arrays of scalar-valued) shape parameters to the infrastructure.
|
1660
|
+
|
1661
|
+
def _parse_args_rvs(self, p, loc=0, size=None):
|
1662
|
+
return tuple(np.moveaxis(p, -1, 0)), loc, 1.0, size
|
1663
|
+
|
1664
|
+
def _parse_args_stats(self, p, loc=0, moments='mv'):
|
1665
|
+
return tuple(np.moveaxis(p, -1, 0)), loc, 1.0, moments
|
1666
|
+
|
1667
|
+
def _parse_args(self, p, loc=0):
|
1668
|
+
return tuple(np.moveaxis(p, -1, 0)), loc, 1.0
|
1669
|
+
|
1670
|
+
# The infrastructure manually binds these methods to the instance, so
|
1671
|
+
# we can only override them by manually binding them, too.
|
1672
|
+
_pb_obj, _pb_cls = poisson_binom, poisson_binom_gen # shorter names (for PEP8)
|
1673
|
+
poisson_binom._parse_args_rvs = _parse_args_rvs.__get__(_pb_obj, _pb_cls)
|
1674
|
+
poisson_binom._parse_args_stats = _parse_args_stats.__get__(_pb_obj, _pb_cls)
|
1675
|
+
poisson_binom._parse_args = _parse_args.__get__(_pb_obj, _pb_cls)
|
1676
|
+
|
1677
|
+
class poisson_binomial_frozen(rv_discrete_frozen):
|
1678
|
+
# copied from rv_frozen; we just need to bind the `_parse_args` methods
|
1679
|
+
def __init__(self, dist, *args, **kwds): # verbatim
|
1680
|
+
self.args = args # verbatim
|
1681
|
+
self.kwds = kwds # verbatim
|
1682
|
+
|
1683
|
+
# create a new instance # verbatim
|
1684
|
+
self.dist = dist.__class__(**dist._updated_ctor_param()) # verbatim
|
1685
|
+
|
1686
|
+
# Here is the only modification
|
1687
|
+
self.dist._parse_args_rvs = _parse_args_rvs.__get__(_pb_obj, _pb_cls)
|
1688
|
+
self.dist._parse_args_stats = _parse_args_stats.__get__(_pb_obj, _pb_cls)
|
1689
|
+
self.dist._parse_args = _parse_args.__get__(_pb_obj, _pb_cls)
|
1690
|
+
|
1691
|
+
shapes, _, _ = self.dist._parse_args(*args, **kwds) # verbatim
|
1692
|
+
self.a, self.b = self.dist._get_support(*shapes) # verbatim
|
1693
|
+
|
1694
|
+
def expect(self, func=None, lb=None, ub=None, conditional=False, **kwds):
|
1695
|
+
a, loc, scale = self.dist._parse_args(*self.args, **self.kwds)
|
1696
|
+
# Here's the modification: we pass all args (including `loc`) into the `args`
|
1697
|
+
# parameter of `expect` so the shape only goes through `_parse_args` once.
|
1698
|
+
return self.dist.expect(func, self.args, loc, lb, ub, conditional, **kwds)
|
1699
|
+
|
1700
|
+
|
1701
|
+
class skellam_gen(rv_discrete):
|
1702
|
+
r"""A Skellam discrete random variable.
|
1703
|
+
|
1704
|
+
%(before_notes)s
|
1705
|
+
|
1706
|
+
Notes
|
1707
|
+
-----
|
1708
|
+
Probability distribution of the difference of two correlated or
|
1709
|
+
uncorrelated Poisson random variables.
|
1710
|
+
|
1711
|
+
Let :math:`k_1` and :math:`k_2` be two Poisson-distributed r.v. with
|
1712
|
+
expected values :math:`\lambda_1` and :math:`\lambda_2`. Then,
|
1713
|
+
:math:`k_1 - k_2` follows a Skellam distribution with parameters
|
1714
|
+
:math:`\mu_1 = \lambda_1 - \rho \sqrt{\lambda_1 \lambda_2}` and
|
1715
|
+
:math:`\mu_2 = \lambda_2 - \rho \sqrt{\lambda_1 \lambda_2}`, where
|
1716
|
+
:math:`\rho` is the correlation coefficient between :math:`k_1` and
|
1717
|
+
:math:`k_2`. If the two Poisson-distributed r.v. are independent then
|
1718
|
+
:math:`\rho = 0`.
|
1719
|
+
|
1720
|
+
Parameters :math:`\mu_1` and :math:`\mu_2` must be strictly positive.
|
1721
|
+
|
1722
|
+
For details see: https://en.wikipedia.org/wiki/Skellam_distribution
|
1723
|
+
|
1724
|
+
`skellam` takes :math:`\mu_1` and :math:`\mu_2` as shape parameters.
|
1725
|
+
|
1726
|
+
%(after_notes)s
|
1727
|
+
|
1728
|
+
%(example)s
|
1729
|
+
|
1730
|
+
"""
|
1731
|
+
def _shape_info(self):
|
1732
|
+
return [_ShapeInfo("mu1", False, (0, np.inf), (False, False)),
|
1733
|
+
_ShapeInfo("mu2", False, (0, np.inf), (False, False))]
|
1734
|
+
|
1735
|
+
def _rvs(self, mu1, mu2, size=None, random_state=None):
|
1736
|
+
n = size
|
1737
|
+
return (random_state.poisson(mu1, n) -
|
1738
|
+
random_state.poisson(mu2, n))
|
1739
|
+
|
1740
|
+
def _pmf(self, x, mu1, mu2):
|
1741
|
+
with np.errstate(over='ignore'): # see gh-17432
|
1742
|
+
px = np.where(x < 0,
|
1743
|
+
scu._ncx2_pdf(2*mu2, 2*(1-x), 2*mu1)*2,
|
1744
|
+
scu._ncx2_pdf(2*mu1, 2*(1+x), 2*mu2)*2)
|
1745
|
+
# ncx2.pdf() returns nan's for extremely low probabilities
|
1746
|
+
return px
|
1747
|
+
|
1748
|
+
def _cdf(self, x, mu1, mu2):
|
1749
|
+
x = floor(x)
|
1750
|
+
with np.errstate(over='ignore'): # see gh-17432
|
1751
|
+
px = np.where(x < 0,
|
1752
|
+
scu._ncx2_cdf(2*mu2, -2*x, 2*mu1),
|
1753
|
+
1 - scu._ncx2_cdf(2*mu1, 2*(x+1), 2*mu2))
|
1754
|
+
return px
|
1755
|
+
|
1756
|
+
def _stats(self, mu1, mu2):
|
1757
|
+
mean = mu1 - mu2
|
1758
|
+
var = mu1 + mu2
|
1759
|
+
g1 = mean / sqrt((var)**3)
|
1760
|
+
g2 = 1 / var
|
1761
|
+
return mean, var, g1, g2
|
1762
|
+
|
1763
|
+
|
1764
|
+
skellam = skellam_gen(a=-np.inf, name="skellam", longname='A Skellam')
|
1765
|
+
|
1766
|
+
|
1767
|
+
class yulesimon_gen(rv_discrete):
|
1768
|
+
r"""A Yule-Simon discrete random variable.
|
1769
|
+
|
1770
|
+
%(before_notes)s
|
1771
|
+
|
1772
|
+
Notes
|
1773
|
+
-----
|
1774
|
+
|
1775
|
+
The probability mass function for the `yulesimon` is:
|
1776
|
+
|
1777
|
+
.. math::
|
1778
|
+
|
1779
|
+
f(k) = \alpha B(k, \alpha+1)
|
1780
|
+
|
1781
|
+
for :math:`k=1,2,3,...`, where :math:`\alpha>0`.
|
1782
|
+
Here :math:`B` refers to the `scipy.special.beta` function.
|
1783
|
+
|
1784
|
+
The sampling of random variates is based on pg 553, Section 6.3 of [1]_.
|
1785
|
+
Our notation maps to the referenced logic via :math:`\alpha=a-1`.
|
1786
|
+
|
1787
|
+
For details see the wikipedia entry [2]_.
|
1788
|
+
|
1789
|
+
References
|
1790
|
+
----------
|
1791
|
+
.. [1] Devroye, Luc. "Non-uniform Random Variate Generation",
|
1792
|
+
(1986) Springer, New York.
|
1793
|
+
|
1794
|
+
.. [2] https://en.wikipedia.org/wiki/Yule-Simon_distribution
|
1795
|
+
|
1796
|
+
%(after_notes)s
|
1797
|
+
|
1798
|
+
%(example)s
|
1799
|
+
|
1800
|
+
"""
|
1801
|
+
def _shape_info(self):
|
1802
|
+
return [_ShapeInfo("alpha", False, (0, np.inf), (False, False))]
|
1803
|
+
|
1804
|
+
def _rvs(self, alpha, size=None, random_state=None):
|
1805
|
+
E1 = random_state.standard_exponential(size)
|
1806
|
+
E2 = random_state.standard_exponential(size)
|
1807
|
+
ans = ceil(-E1 / log1p(-exp(-E2 / alpha)))
|
1808
|
+
return ans
|
1809
|
+
|
1810
|
+
def _pmf(self, x, alpha):
|
1811
|
+
return alpha * special.beta(x, alpha + 1)
|
1812
|
+
|
1813
|
+
def _argcheck(self, alpha):
|
1814
|
+
return (alpha > 0)
|
1815
|
+
|
1816
|
+
def _logpmf(self, x, alpha):
|
1817
|
+
return log(alpha) + special.betaln(x, alpha + 1)
|
1818
|
+
|
1819
|
+
def _cdf(self, x, alpha):
|
1820
|
+
return 1 - x * special.beta(x, alpha + 1)
|
1821
|
+
|
1822
|
+
def _sf(self, x, alpha):
|
1823
|
+
return x * special.beta(x, alpha + 1)
|
1824
|
+
|
1825
|
+
def _logsf(self, x, alpha):
|
1826
|
+
return log(x) + special.betaln(x, alpha + 1)
|
1827
|
+
|
1828
|
+
def _stats(self, alpha):
|
1829
|
+
mu = np.where(alpha <= 1, np.inf, alpha / (alpha - 1))
|
1830
|
+
mu2 = np.where(alpha > 2,
|
1831
|
+
alpha**2 / ((alpha - 2.0) * (alpha - 1)**2),
|
1832
|
+
np.inf)
|
1833
|
+
mu2 = np.where(alpha <= 1, np.nan, mu2)
|
1834
|
+
g1 = np.where(alpha > 3,
|
1835
|
+
sqrt(alpha - 2) * (alpha + 1)**2 / (alpha * (alpha - 3)),
|
1836
|
+
np.inf)
|
1837
|
+
g1 = np.where(alpha <= 2, np.nan, g1)
|
1838
|
+
g2 = np.where(alpha > 4,
|
1839
|
+
alpha + 3 + ((11 * alpha**3 - 49 * alpha - 22) /
|
1840
|
+
(alpha * (alpha - 4) * (alpha - 3))),
|
1841
|
+
np.inf)
|
1842
|
+
g2 = np.where(alpha <= 2, np.nan, g2)
|
1843
|
+
return mu, mu2, g1, g2
|
1844
|
+
|
1845
|
+
|
1846
|
+
yulesimon = yulesimon_gen(name='yulesimon', a=1)
|
1847
|
+
|
1848
|
+
|
1849
|
+
class _nchypergeom_gen(rv_discrete):
|
1850
|
+
r"""A noncentral hypergeometric discrete random variable.
|
1851
|
+
|
1852
|
+
For subclassing by nchypergeom_fisher_gen and nchypergeom_wallenius_gen.
|
1853
|
+
|
1854
|
+
"""
|
1855
|
+
|
1856
|
+
rvs_name = None
|
1857
|
+
dist = None
|
1858
|
+
|
1859
|
+
def _shape_info(self):
|
1860
|
+
return [_ShapeInfo("M", True, (0, np.inf), (True, False)),
|
1861
|
+
_ShapeInfo("n", True, (0, np.inf), (True, False)),
|
1862
|
+
_ShapeInfo("N", True, (0, np.inf), (True, False)),
|
1863
|
+
_ShapeInfo("odds", False, (0, np.inf), (False, False))]
|
1864
|
+
|
1865
|
+
def _get_support(self, M, n, N, odds):
|
1866
|
+
N, m1, n = M, n, N # follow Wikipedia notation
|
1867
|
+
m2 = N - m1
|
1868
|
+
x_min = np.maximum(0, n - m2)
|
1869
|
+
x_max = np.minimum(n, m1)
|
1870
|
+
return x_min, x_max
|
1871
|
+
|
1872
|
+
def _argcheck(self, M, n, N, odds):
|
1873
|
+
M, n = np.asarray(M), np.asarray(n),
|
1874
|
+
N, odds = np.asarray(N), np.asarray(odds)
|
1875
|
+
cond1 = (~np.isnan(M)) & (M.astype(int) == M) & (M >= 0)
|
1876
|
+
cond2 = (~np.isnan(n)) & (n.astype(int) == n) & (n >= 0)
|
1877
|
+
cond3 = (~np.isnan(N)) & (N.astype(int) == N) & (N >= 0)
|
1878
|
+
cond4 = odds > 0
|
1879
|
+
cond5 = N <= M
|
1880
|
+
cond6 = n <= M
|
1881
|
+
return cond1 & cond2 & cond3 & cond4 & cond5 & cond6
|
1882
|
+
|
1883
|
+
def _rvs(self, M, n, N, odds, size=None, random_state=None):
|
1884
|
+
|
1885
|
+
@_vectorize_rvs_over_shapes
|
1886
|
+
def _rvs1(M, n, N, odds, size, random_state):
|
1887
|
+
if np.isnan(M) | np.isnan(n) | np.isnan(N):
|
1888
|
+
return np.full(size, np.nan)
|
1889
|
+
length = np.prod(size)
|
1890
|
+
urn = _PyStochasticLib3()
|
1891
|
+
rv_gen = getattr(urn, self.rvs_name)
|
1892
|
+
rvs = rv_gen(N, n, M, odds, length, random_state)
|
1893
|
+
rvs = rvs.reshape(size)
|
1894
|
+
return rvs
|
1895
|
+
|
1896
|
+
return _rvs1(M, n, N, odds, size=size, random_state=random_state)
|
1897
|
+
|
1898
|
+
def _pmf(self, x, M, n, N, odds):
|
1899
|
+
|
1900
|
+
x, M, n, N, odds = np.broadcast_arrays(x, M, n, N, odds)
|
1901
|
+
if x.size == 0: # np.vectorize doesn't work with zero size input
|
1902
|
+
return np.empty_like(x)
|
1903
|
+
|
1904
|
+
@np.vectorize
|
1905
|
+
def _pmf1(x, M, n, N, odds):
|
1906
|
+
if np.isnan(x) | np.isnan(M) | np.isnan(n) | np.isnan(N):
|
1907
|
+
return np.nan
|
1908
|
+
urn = self.dist(N, n, M, odds, 1e-12)
|
1909
|
+
return urn.probability(x)
|
1910
|
+
|
1911
|
+
return _pmf1(x, M, n, N, odds)
|
1912
|
+
|
1913
|
+
def _stats(self, M, n, N, odds, moments='mv'):
|
1914
|
+
|
1915
|
+
@np.vectorize
|
1916
|
+
def _moments1(M, n, N, odds):
|
1917
|
+
if np.isnan(M) | np.isnan(n) | np.isnan(N):
|
1918
|
+
return np.nan, np.nan
|
1919
|
+
urn = self.dist(N, n, M, odds, 1e-12)
|
1920
|
+
return urn.moments()
|
1921
|
+
|
1922
|
+
m, v = (_moments1(M, n, N, odds) if ("m" in moments or "v" in moments)
|
1923
|
+
else (None, None))
|
1924
|
+
s, k = None, None
|
1925
|
+
return m, v, s, k
|
1926
|
+
|
1927
|
+
|
1928
|
+
class nchypergeom_fisher_gen(_nchypergeom_gen):
|
1929
|
+
r"""A Fisher's noncentral hypergeometric discrete random variable.
|
1930
|
+
|
1931
|
+
Fisher's noncentral hypergeometric distribution models drawing objects of
|
1932
|
+
two types from a bin. `M` is the total number of objects, `n` is the
|
1933
|
+
number of Type I objects, and `odds` is the odds ratio: the odds of
|
1934
|
+
selecting a Type I object rather than a Type II object when there is only
|
1935
|
+
one object of each type.
|
1936
|
+
The random variate represents the number of Type I objects drawn if we
|
1937
|
+
take a handful of objects from the bin at once and find out afterwards
|
1938
|
+
that we took `N` objects.
|
1939
|
+
|
1940
|
+
%(before_notes)s
|
1941
|
+
|
1942
|
+
See Also
|
1943
|
+
--------
|
1944
|
+
nchypergeom_wallenius, hypergeom, nhypergeom
|
1945
|
+
|
1946
|
+
Notes
|
1947
|
+
-----
|
1948
|
+
Let mathematical symbols :math:`N`, :math:`n`, and :math:`M` correspond
|
1949
|
+
with parameters `N`, `n`, and `M` (respectively) as defined above.
|
1950
|
+
|
1951
|
+
The probability mass function is defined as
|
1952
|
+
|
1953
|
+
.. math::
|
1954
|
+
|
1955
|
+
p(x; M, n, N, \omega) =
|
1956
|
+
\frac{\binom{n}{x}\binom{M - n}{N-x}\omega^x}{P_0},
|
1957
|
+
|
1958
|
+
for
|
1959
|
+
:math:`x \in [x_l, x_u]`,
|
1960
|
+
:math:`M \in {\mathbb N}`,
|
1961
|
+
:math:`n \in [0, M]`,
|
1962
|
+
:math:`N \in [0, M]`,
|
1963
|
+
:math:`\omega > 0`,
|
1964
|
+
where
|
1965
|
+
:math:`x_l = \max(0, N - (M - n))`,
|
1966
|
+
:math:`x_u = \min(N, n)`,
|
1967
|
+
|
1968
|
+
.. math::
|
1969
|
+
|
1970
|
+
P_0 = \sum_{y=x_l}^{x_u} \binom{n}{y}\binom{M - n}{N-y}\omega^y,
|
1971
|
+
|
1972
|
+
and the binomial coefficients are defined as
|
1973
|
+
|
1974
|
+
.. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
|
1975
|
+
|
1976
|
+
`nchypergeom_fisher` uses the BiasedUrn package by Agner Fog with
|
1977
|
+
permission for it to be distributed under SciPy's license.
|
1978
|
+
|
1979
|
+
The symbols used to denote the shape parameters (`N`, `n`, and `M`) are not
|
1980
|
+
universally accepted; they are chosen for consistency with `hypergeom`.
|
1981
|
+
|
1982
|
+
Note that Fisher's noncentral hypergeometric distribution is distinct
|
1983
|
+
from Wallenius' noncentral hypergeometric distribution, which models
|
1984
|
+
drawing a pre-determined `N` objects from a bin one by one.
|
1985
|
+
When the odds ratio is unity, however, both distributions reduce to the
|
1986
|
+
ordinary hypergeometric distribution.
|
1987
|
+
|
1988
|
+
%(after_notes)s
|
1989
|
+
|
1990
|
+
References
|
1991
|
+
----------
|
1992
|
+
.. [1] Agner Fog, "Biased Urn Theory".
|
1993
|
+
https://cran.r-project.org/web/packages/BiasedUrn/vignettes/UrnTheory.pdf
|
1994
|
+
|
1995
|
+
.. [2] "Fisher's noncentral hypergeometric distribution", Wikipedia,
|
1996
|
+
https://en.wikipedia.org/wiki/Fisher's_noncentral_hypergeometric_distribution
|
1997
|
+
|
1998
|
+
%(example)s
|
1999
|
+
|
2000
|
+
"""
|
2001
|
+
|
2002
|
+
rvs_name = "rvs_fisher"
|
2003
|
+
dist = _PyFishersNCHypergeometric
|
2004
|
+
|
2005
|
+
|
2006
|
+
nchypergeom_fisher = nchypergeom_fisher_gen(
|
2007
|
+
name='nchypergeom_fisher',
|
2008
|
+
longname="A Fisher's noncentral hypergeometric")
|
2009
|
+
|
2010
|
+
|
2011
|
+
class nchypergeom_wallenius_gen(_nchypergeom_gen):
|
2012
|
+
r"""A Wallenius' noncentral hypergeometric discrete random variable.
|
2013
|
+
|
2014
|
+
Wallenius' noncentral hypergeometric distribution models drawing objects of
|
2015
|
+
two types from a bin. `M` is the total number of objects, `n` is the
|
2016
|
+
number of Type I objects, and `odds` is the odds ratio: the odds of
|
2017
|
+
selecting a Type I object rather than a Type II object when there is only
|
2018
|
+
one object of each type.
|
2019
|
+
The random variate represents the number of Type I objects drawn if we
|
2020
|
+
draw a pre-determined `N` objects from a bin one by one.
|
2021
|
+
|
2022
|
+
%(before_notes)s
|
2023
|
+
|
2024
|
+
See Also
|
2025
|
+
--------
|
2026
|
+
nchypergeom_fisher, hypergeom, nhypergeom
|
2027
|
+
|
2028
|
+
Notes
|
2029
|
+
-----
|
2030
|
+
Let mathematical symbols :math:`N`, :math:`n`, and :math:`M` correspond
|
2031
|
+
with parameters `N`, `n`, and `M` (respectively) as defined above.
|
2032
|
+
|
2033
|
+
The probability mass function is defined as
|
2034
|
+
|
2035
|
+
.. math::
|
2036
|
+
|
2037
|
+
p(x; N, n, M) = \binom{n}{x} \binom{M - n}{N-x}
|
2038
|
+
\int_0^1 \left(1-t^{\omega/D}\right)^x\left(1-t^{1/D}\right)^{N-x} dt
|
2039
|
+
|
2040
|
+
for
|
2041
|
+
:math:`x \in [x_l, x_u]`,
|
2042
|
+
:math:`M \in {\mathbb N}`,
|
2043
|
+
:math:`n \in [0, M]`,
|
2044
|
+
:math:`N \in [0, M]`,
|
2045
|
+
:math:`\omega > 0`,
|
2046
|
+
where
|
2047
|
+
:math:`x_l = \max(0, N - (M - n))`,
|
2048
|
+
:math:`x_u = \min(N, n)`,
|
2049
|
+
|
2050
|
+
.. math::
|
2051
|
+
|
2052
|
+
D = \omega(n - x) + ((M - n)-(N-x)),
|
2053
|
+
|
2054
|
+
and the binomial coefficients are defined as
|
2055
|
+
|
2056
|
+
.. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.
|
2057
|
+
|
2058
|
+
`nchypergeom_wallenius` uses the BiasedUrn package by Agner Fog with
|
2059
|
+
permission for it to be distributed under SciPy's license.
|
2060
|
+
|
2061
|
+
The symbols used to denote the shape parameters (`N`, `n`, and `M`) are not
|
2062
|
+
universally accepted; they are chosen for consistency with `hypergeom`.
|
2063
|
+
|
2064
|
+
Note that Wallenius' noncentral hypergeometric distribution is distinct
|
2065
|
+
from Fisher's noncentral hypergeometric distribution, which models
|
2066
|
+
take a handful of objects from the bin at once, finding out afterwards
|
2067
|
+
that `N` objects were taken.
|
2068
|
+
When the odds ratio is unity, however, both distributions reduce to the
|
2069
|
+
ordinary hypergeometric distribution.
|
2070
|
+
|
2071
|
+
%(after_notes)s
|
2072
|
+
|
2073
|
+
References
|
2074
|
+
----------
|
2075
|
+
.. [1] Agner Fog, "Biased Urn Theory".
|
2076
|
+
https://cran.r-project.org/web/packages/BiasedUrn/vignettes/UrnTheory.pdf
|
2077
|
+
|
2078
|
+
.. [2] "Wallenius' noncentral hypergeometric distribution", Wikipedia,
|
2079
|
+
https://en.wikipedia.org/wiki/Wallenius'_noncentral_hypergeometric_distribution
|
2080
|
+
|
2081
|
+
%(example)s
|
2082
|
+
|
2083
|
+
"""
|
2084
|
+
|
2085
|
+
rvs_name = "rvs_wallenius"
|
2086
|
+
dist = _PyWalleniusNCHypergeometric
|
2087
|
+
|
2088
|
+
|
2089
|
+
nchypergeom_wallenius = nchypergeom_wallenius_gen(
|
2090
|
+
name='nchypergeom_wallenius',
|
2091
|
+
longname="A Wallenius' noncentral hypergeometric")
|
2092
|
+
|
2093
|
+
|
2094
|
+
# Collect names of classes and objects in this module.
|
2095
|
+
pairs = list(globals().copy().items())
|
2096
|
+
_distn_names, _distn_gen_names = get_distribution_names(pairs, rv_discrete)
|
2097
|
+
|
2098
|
+
__all__ = _distn_names + _distn_gen_names
|