scipy 1.16.1__cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.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 +138 -0
- scipy/_cyutility.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/_lib/_gcutils.py +105 -0
- scipy/_lib/_pep440.py +487 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/_lib/_test_deprecation_call.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/__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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/cluster/_vq.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/integrate/_ode.py +1395 -0
- scipy/integrate/_odepack.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/integrate/_odepack_py.py +273 -0
- scipy/integrate/_quad_vec.py +674 -0
- scipy/integrate/_quadpack.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/integrate/_test_odeint_banded.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/integrate/_vode.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/interpolate/_dierckx.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/interpolate/_fitpack.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/interpolate/_rbf.py +290 -0
- scipy/interpolate/_rbfinterp.py +550 -0
- scipy/interpolate/_rbfinterp_pythran.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/interpolate/_rgi.py +764 -0
- scipy/interpolate/_rgi_cython.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/io/matlab/_miobase.py +435 -0
- scipy/io/matlab/_streams.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_decomp_ldl.py +356 -0
- scipy/linalg/_decomp_lu.py +401 -0
- scipy/linalg/_decomp_lu_cython.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_expm_frechet.py +417 -0
- scipy/linalg/_fblas.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_flapack.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_lapack_subroutines.h +1521 -0
- scipy/linalg/_linalg_pythran.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_matfuncs.py +1050 -0
- scipy/linalg/_matfuncs_expm.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_matfuncs_expm.pyi +6 -0
- scipy/linalg/_matfuncs_inv_ssq.py +886 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +107 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/_misc.py +191 -0
- scipy/linalg/_procrustes.py +113 -0
- scipy/linalg/_sketches.py +189 -0
- scipy/linalg/_solve_toeplitz.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/linalg/cython_blas.pxd +169 -0
- scipy/linalg/cython_blas.pyx +1432 -0
- scipy/linalg/cython_lapack.cpython-314-aarch64-linux-gnu.so +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 +3616 -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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/ndimage/_cytest.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/ndimage/_ndimage_api.py +16 -0
- scipy/ndimage/_ni_docstrings.py +214 -0
- scipy/ndimage/_ni_label.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/ndimage/_ni_support.py +139 -0
- scipy/ndimage/_rank_filter_1d.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/optimize/_hessian_update_strategy.py +479 -0
- scipy/optimize/_highspy/__init__.py +0 -0
- scipy/optimize/_highspy/_core.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/optimize/_highspy/_highs_options.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/optimize/_highspy/_highs_wrapper.py +338 -0
- scipy/optimize/_isotonic.py +157 -0
- scipy/optimize/_lbfgsb.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/optimize/_minpack_py.py +1178 -0
- scipy/optimize/_moduleTNC.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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 +3335 -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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/signal/_peak_finding.py +1310 -0
- scipy/signal/_peak_finding_utils.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_savitzky_golay.py +357 -0
- scipy/signal/_short_time_fft.py +2187 -0
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +5309 -0
- scipy/signal/_sigtools.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/signal/_sosfilt.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/signal/_spectral_py.py +2471 -0
- scipy/signal/_spline.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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 +1098 -0
- scipy/signal/tests/test_signaltools.py +4729 -0
- scipy/signal/tests/test_spectral.py +2103 -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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/csgraph/_laplacian.py +563 -0
- scipy/sparse/csgraph/_matching.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/spatial/_distance_pybind.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/spatial/_distance_wrap.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/spatial/_geometric_slerp.py +238 -0
- scipy/spatial/_hausdorff.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/spatial/_kdtree.py +920 -0
- scipy/spatial/_plotutils.py +274 -0
- scipy/spatial/_procrustes.py +132 -0
- scipy/spatial/_qhull.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/spatial/_qhull.pyi +213 -0
- scipy/spatial/_spherical_voronoi.py +341 -0
- scipy/spatial/_voronoi.cpython-314-aarch64-linux-gnu.so +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/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 +2388 -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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/spatial/transform/_rotation.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/special/_ellip_harm.py +214 -0
- scipy/special/_ellip_harm_2.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/special/_gufuncs.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/special/_special_ufuncs.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/special/_test_internal.pyi +9 -0
- scipy/special/_testutils.py +321 -0
- scipy/special/_ufuncs.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/special/_ufuncs.pyi +522 -0
- scipy/special/_ufuncs.pyx +13173 -0
- scipy/special/_ufuncs_cxx.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/stats/_axis_nan_policy.py +692 -0
- scipy/stats/_biasedurn.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/stats/_qmc_cy.pyi +54 -0
- scipy/stats/_qmvnt.py +454 -0
- scipy/stats/_qmvnt_cy.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/__init__.py +4 -0
- scipy/stats/_rcont/rcont.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +0 -0
- scipy/stats/_sobol.pyi +54 -0
- scipy/stats/_sobol_direction_numbers.npz +0 -0
- scipy/stats/_stats.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.cpython-314-aarch64-linux-gnu.so +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.1.dist-info/LICENSE.txt +934 -0
- scipy-1.16.1.dist-info/METADATA +1083 -0
- scipy-1.16.1.dist-info/RECORD +1415 -0
- scipy-1.16.1.dist-info/WHEEL +6 -0
- scipy.libs/libgfortran-daac5196-038a5e3c.so.5.0.0 +0 -0
- scipy.libs/libgfortran-daac5196.so.5.0.0 +0 -0
- scipy.libs/libscipy_openblas-9778f98e.so +0 -0
@@ -0,0 +1,2103 @@
|
|
1
|
+
import sys
|
2
|
+
|
3
|
+
import numpy as np
|
4
|
+
from numpy.testing import (assert_,
|
5
|
+
assert_allclose, assert_array_equal, assert_equal,
|
6
|
+
assert_array_almost_equal_nulp, suppress_warnings)
|
7
|
+
import pytest
|
8
|
+
from pytest import raises as assert_raises
|
9
|
+
|
10
|
+
from scipy import signal
|
11
|
+
from scipy._lib._array_api import xp_assert_close
|
12
|
+
from scipy.fft import fftfreq, rfftfreq, fft, irfft
|
13
|
+
from scipy.integrate import trapezoid
|
14
|
+
from scipy.signal import (periodogram, welch, lombscargle, coherence, csd,
|
15
|
+
spectrogram, check_COLA, check_NOLA)
|
16
|
+
from scipy.signal.windows import hann
|
17
|
+
from scipy.signal._spectral_py import _spectral_helper
|
18
|
+
|
19
|
+
# Compare ShortTimeFFT.stft() / ShortTimeFFT.istft() with stft() / istft():
|
20
|
+
from scipy.signal.tests._scipy_spectral_test_shim import stft_compare as stft
|
21
|
+
from scipy.signal.tests._scipy_spectral_test_shim import istft_compare as istft
|
22
|
+
|
23
|
+
|
24
|
+
class TestPeriodogram:
|
25
|
+
def test_real_onesided_even(self):
|
26
|
+
x = np.zeros(16)
|
27
|
+
x[0] = 1
|
28
|
+
f, p = periodogram(x)
|
29
|
+
assert_allclose(f, np.linspace(0, 0.5, 9))
|
30
|
+
q = np.ones(9)
|
31
|
+
q[0] = 0
|
32
|
+
q[-1] /= 2.0
|
33
|
+
q /= 8
|
34
|
+
assert_allclose(p, q)
|
35
|
+
|
36
|
+
def test_real_onesided_odd(self):
|
37
|
+
x = np.zeros(15)
|
38
|
+
x[0] = 1
|
39
|
+
f, p = periodogram(x)
|
40
|
+
assert_allclose(f, np.arange(8.0)/15.0)
|
41
|
+
q = np.ones(8)
|
42
|
+
q[0] = 0
|
43
|
+
q *= 2.0/15.0
|
44
|
+
assert_allclose(p, q, atol=1e-15)
|
45
|
+
|
46
|
+
def test_real_twosided(self):
|
47
|
+
x = np.zeros(16)
|
48
|
+
x[0] = 1
|
49
|
+
f, p = periodogram(x, return_onesided=False)
|
50
|
+
assert_allclose(f, fftfreq(16, 1.0))
|
51
|
+
q = np.full(16, 1/16.0)
|
52
|
+
q[0] = 0
|
53
|
+
assert_allclose(p, q)
|
54
|
+
|
55
|
+
def test_real_spectrum(self):
|
56
|
+
x = np.zeros(16)
|
57
|
+
x[0] = 1
|
58
|
+
f, p = periodogram(x, scaling='spectrum')
|
59
|
+
g, q = periodogram(x, scaling='density')
|
60
|
+
assert_allclose(f, np.linspace(0, 0.5, 9))
|
61
|
+
assert_allclose(p, q/16.0)
|
62
|
+
|
63
|
+
def test_integer_even(self):
|
64
|
+
x = np.zeros(16, dtype=int)
|
65
|
+
x[0] = 1
|
66
|
+
f, p = periodogram(x)
|
67
|
+
assert_allclose(f, np.linspace(0, 0.5, 9))
|
68
|
+
q = np.ones(9)
|
69
|
+
q[0] = 0
|
70
|
+
q[-1] /= 2.0
|
71
|
+
q /= 8
|
72
|
+
assert_allclose(p, q)
|
73
|
+
|
74
|
+
def test_integer_odd(self):
|
75
|
+
x = np.zeros(15, dtype=int)
|
76
|
+
x[0] = 1
|
77
|
+
f, p = periodogram(x)
|
78
|
+
assert_allclose(f, np.arange(8.0)/15.0)
|
79
|
+
q = np.ones(8)
|
80
|
+
q[0] = 0
|
81
|
+
q *= 2.0/15.0
|
82
|
+
assert_allclose(p, q, atol=1e-15)
|
83
|
+
|
84
|
+
def test_integer_twosided(self):
|
85
|
+
x = np.zeros(16, dtype=int)
|
86
|
+
x[0] = 1
|
87
|
+
f, p = periodogram(x, return_onesided=False)
|
88
|
+
assert_allclose(f, fftfreq(16, 1.0))
|
89
|
+
q = np.full(16, 1/16.0)
|
90
|
+
q[0] = 0
|
91
|
+
assert_allclose(p, q)
|
92
|
+
|
93
|
+
def test_complex(self):
|
94
|
+
x = np.zeros(16, np.complex128)
|
95
|
+
x[0] = 1.0 + 2.0j
|
96
|
+
f, p = periodogram(x, return_onesided=False)
|
97
|
+
assert_allclose(f, fftfreq(16, 1.0))
|
98
|
+
q = np.full(16, 5.0/16.0)
|
99
|
+
q[0] = 0
|
100
|
+
assert_allclose(p, q)
|
101
|
+
|
102
|
+
def test_unk_scaling(self):
|
103
|
+
assert_raises(ValueError, periodogram, np.zeros(4, np.complex128),
|
104
|
+
scaling='foo')
|
105
|
+
|
106
|
+
@pytest.mark.skipif(
|
107
|
+
sys.maxsize <= 2**32,
|
108
|
+
reason="On some 32-bit tolerance issue"
|
109
|
+
)
|
110
|
+
def test_nd_axis_m1(self):
|
111
|
+
x = np.zeros(20, dtype=np.float64)
|
112
|
+
x = x.reshape((2,1,10))
|
113
|
+
x[:,:,0] = 1.0
|
114
|
+
f, p = periodogram(x)
|
115
|
+
assert_array_equal(p.shape, (2, 1, 6))
|
116
|
+
assert_array_almost_equal_nulp(p[0,0,:], p[1,0,:], 60)
|
117
|
+
f0, p0 = periodogram(x[0,0,:])
|
118
|
+
assert_array_almost_equal_nulp(p0[np.newaxis,:], p[1,:], 60)
|
119
|
+
|
120
|
+
@pytest.mark.skipif(
|
121
|
+
sys.maxsize <= 2**32,
|
122
|
+
reason="On some 32-bit tolerance issue"
|
123
|
+
)
|
124
|
+
def test_nd_axis_0(self):
|
125
|
+
x = np.zeros(20, dtype=np.float64)
|
126
|
+
x = x.reshape((10,2,1))
|
127
|
+
x[0,:,:] = 1.0
|
128
|
+
f, p = periodogram(x, axis=0)
|
129
|
+
assert_array_equal(p.shape, (6,2,1))
|
130
|
+
assert_array_almost_equal_nulp(p[:,0,0], p[:,1,0], 60)
|
131
|
+
f0, p0 = periodogram(x[:,0,0])
|
132
|
+
assert_array_almost_equal_nulp(p0, p[:,1,0])
|
133
|
+
|
134
|
+
def test_window_external(self):
|
135
|
+
x = np.zeros(16)
|
136
|
+
x[0] = 1
|
137
|
+
f, p = periodogram(x, 10, 'hann')
|
138
|
+
win = signal.get_window('hann', 16)
|
139
|
+
fe, pe = periodogram(x, 10, win)
|
140
|
+
assert_array_almost_equal_nulp(p, pe)
|
141
|
+
assert_array_almost_equal_nulp(f, fe)
|
142
|
+
win_err = signal.get_window('hann', 32)
|
143
|
+
assert_raises(ValueError, periodogram, x,
|
144
|
+
10, win_err) # win longer than signal
|
145
|
+
|
146
|
+
def test_padded_fft(self):
|
147
|
+
x = np.zeros(16)
|
148
|
+
x[0] = 1
|
149
|
+
f, p = periodogram(x)
|
150
|
+
fp, pp = periodogram(x, nfft=32)
|
151
|
+
assert_allclose(f, fp[::2])
|
152
|
+
assert_allclose(p, pp[::2])
|
153
|
+
assert_array_equal(pp.shape, (17,))
|
154
|
+
|
155
|
+
def test_empty_input(self):
|
156
|
+
f, p = periodogram([])
|
157
|
+
assert_array_equal(f.shape, (0,))
|
158
|
+
assert_array_equal(p.shape, (0,))
|
159
|
+
for shape in [(0,), (3,0), (0,5,2)]:
|
160
|
+
f, p = periodogram(np.empty(shape))
|
161
|
+
assert_array_equal(f.shape, shape)
|
162
|
+
assert_array_equal(p.shape, shape)
|
163
|
+
|
164
|
+
def test_empty_input_other_axis(self):
|
165
|
+
for shape in [(3,0), (0,5,2)]:
|
166
|
+
f, p = periodogram(np.empty(shape), axis=1)
|
167
|
+
assert_array_equal(f.shape, shape)
|
168
|
+
assert_array_equal(p.shape, shape)
|
169
|
+
|
170
|
+
def test_short_nfft(self):
|
171
|
+
x = np.zeros(18)
|
172
|
+
x[0] = 1
|
173
|
+
f, p = periodogram(x, nfft=16)
|
174
|
+
assert_allclose(f, np.linspace(0, 0.5, 9))
|
175
|
+
q = np.ones(9)
|
176
|
+
q[0] = 0
|
177
|
+
q[-1] /= 2.0
|
178
|
+
q /= 8
|
179
|
+
assert_allclose(p, q)
|
180
|
+
|
181
|
+
def test_nfft_is_xshape(self):
|
182
|
+
x = np.zeros(16)
|
183
|
+
x[0] = 1
|
184
|
+
f, p = periodogram(x, nfft=16)
|
185
|
+
assert_allclose(f, np.linspace(0, 0.5, 9))
|
186
|
+
q = np.ones(9)
|
187
|
+
q[0] = 0
|
188
|
+
q[-1] /= 2.0
|
189
|
+
q /= 8
|
190
|
+
assert_allclose(p, q)
|
191
|
+
|
192
|
+
def test_real_onesided_even_32(self):
|
193
|
+
x = np.zeros(16, 'f')
|
194
|
+
x[0] = 1
|
195
|
+
f, p = periodogram(x)
|
196
|
+
assert_allclose(f, np.linspace(0, 0.5, 9))
|
197
|
+
q = np.ones(9, 'f')
|
198
|
+
q[0] = 0
|
199
|
+
q[-1] /= 2.0
|
200
|
+
q /= 8
|
201
|
+
assert_allclose(p, q)
|
202
|
+
assert_(p.dtype == q.dtype)
|
203
|
+
|
204
|
+
def test_real_onesided_odd_32(self):
|
205
|
+
x = np.zeros(15, 'f')
|
206
|
+
x[0] = 1
|
207
|
+
f, p = periodogram(x)
|
208
|
+
assert_allclose(f, np.arange(8.0)/15.0)
|
209
|
+
q = np.ones(8, 'f')
|
210
|
+
q[0] = 0
|
211
|
+
q *= 2.0/15.0
|
212
|
+
assert_allclose(p, q, atol=1e-7)
|
213
|
+
assert_(p.dtype == q.dtype)
|
214
|
+
|
215
|
+
def test_real_twosided_32(self):
|
216
|
+
x = np.zeros(16, 'f')
|
217
|
+
x[0] = 1
|
218
|
+
f, p = periodogram(x, return_onesided=False)
|
219
|
+
assert_allclose(f, fftfreq(16, 1.0))
|
220
|
+
q = np.full(16, 1/16.0, 'f')
|
221
|
+
q[0] = 0
|
222
|
+
assert_allclose(p, q)
|
223
|
+
assert_(p.dtype == q.dtype)
|
224
|
+
|
225
|
+
def test_complex_32(self):
|
226
|
+
x = np.zeros(16, 'F')
|
227
|
+
x[0] = 1.0 + 2.0j
|
228
|
+
f, p = periodogram(x, return_onesided=False)
|
229
|
+
assert_allclose(f, fftfreq(16, 1.0))
|
230
|
+
q = np.full(16, 5.0/16.0, 'f')
|
231
|
+
q[0] = 0
|
232
|
+
assert_allclose(p, q)
|
233
|
+
assert_(p.dtype == q.dtype)
|
234
|
+
|
235
|
+
def test_shorter_window_error(self):
|
236
|
+
x = np.zeros(16)
|
237
|
+
x[0] = 1
|
238
|
+
win = signal.get_window('hann', 10)
|
239
|
+
expected_msg = ('the size of the window must be the same size '
|
240
|
+
'of the input on the specified axis')
|
241
|
+
with assert_raises(ValueError, match=expected_msg):
|
242
|
+
periodogram(x, window=win)
|
243
|
+
|
244
|
+
|
245
|
+
class TestWelch:
|
246
|
+
def test_real_onesided_even(self):
|
247
|
+
x = np.zeros(16)
|
248
|
+
x[0] = 1
|
249
|
+
x[8] = 1
|
250
|
+
f, p = welch(x, nperseg=8)
|
251
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
252
|
+
q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
|
253
|
+
0.11111111])
|
254
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
255
|
+
|
256
|
+
def test_real_onesided_odd(self):
|
257
|
+
x = np.zeros(16)
|
258
|
+
x[0] = 1
|
259
|
+
x[8] = 1
|
260
|
+
f, p = welch(x, nperseg=9)
|
261
|
+
assert_allclose(f, np.arange(5.0)/9.0)
|
262
|
+
q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
|
263
|
+
0.17072113])
|
264
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
265
|
+
|
266
|
+
def test_real_twosided(self):
|
267
|
+
x = np.zeros(16)
|
268
|
+
x[0] = 1
|
269
|
+
x[8] = 1
|
270
|
+
f, p = welch(x, nperseg=8, return_onesided=False)
|
271
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
272
|
+
q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
|
273
|
+
0.11111111, 0.11111111, 0.11111111, 0.07638889])
|
274
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
275
|
+
|
276
|
+
def test_real_spectrum(self):
|
277
|
+
x = np.zeros(16)
|
278
|
+
x[0] = 1
|
279
|
+
x[8] = 1
|
280
|
+
f, p = welch(x, nperseg=8, scaling='spectrum')
|
281
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
282
|
+
q = np.array([0.015625, 0.02864583, 0.04166667, 0.04166667,
|
283
|
+
0.02083333])
|
284
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
285
|
+
|
286
|
+
def test_integer_onesided_even(self):
|
287
|
+
x = np.zeros(16, dtype=int)
|
288
|
+
x[0] = 1
|
289
|
+
x[8] = 1
|
290
|
+
f, p = welch(x, nperseg=8)
|
291
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
292
|
+
q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
|
293
|
+
0.11111111])
|
294
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
295
|
+
|
296
|
+
def test_integer_onesided_odd(self):
|
297
|
+
x = np.zeros(16, dtype=int)
|
298
|
+
x[0] = 1
|
299
|
+
x[8] = 1
|
300
|
+
f, p = welch(x, nperseg=9)
|
301
|
+
assert_allclose(f, np.arange(5.0)/9.0)
|
302
|
+
q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
|
303
|
+
0.17072113])
|
304
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
305
|
+
|
306
|
+
def test_integer_twosided(self):
|
307
|
+
x = np.zeros(16, dtype=int)
|
308
|
+
x[0] = 1
|
309
|
+
x[8] = 1
|
310
|
+
f, p = welch(x, nperseg=8, return_onesided=False)
|
311
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
312
|
+
q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
|
313
|
+
0.11111111, 0.11111111, 0.11111111, 0.07638889])
|
314
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
315
|
+
|
316
|
+
def test_complex(self):
|
317
|
+
x = np.zeros(16, np.complex128)
|
318
|
+
x[0] = 1.0 + 2.0j
|
319
|
+
x[8] = 1.0 + 2.0j
|
320
|
+
f, p = welch(x, nperseg=8, return_onesided=False)
|
321
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
322
|
+
q = np.array([0.41666667, 0.38194444, 0.55555556, 0.55555556,
|
323
|
+
0.55555556, 0.55555556, 0.55555556, 0.38194444])
|
324
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
325
|
+
|
326
|
+
def test_unk_scaling(self):
|
327
|
+
assert_raises(ValueError, welch, np.zeros(4, np.complex128),
|
328
|
+
scaling='foo', nperseg=4)
|
329
|
+
|
330
|
+
def test_detrend_linear(self):
|
331
|
+
x = np.arange(10, dtype=np.float64) + 0.04
|
332
|
+
f, p = welch(x, nperseg=10, detrend='linear')
|
333
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
334
|
+
|
335
|
+
def test_no_detrending(self):
|
336
|
+
x = np.arange(10, dtype=np.float64) + 0.04
|
337
|
+
f1, p1 = welch(x, nperseg=10, detrend=False)
|
338
|
+
f2, p2 = welch(x, nperseg=10, detrend=lambda x: x)
|
339
|
+
assert_allclose(f1, f2, atol=1e-15)
|
340
|
+
assert_allclose(p1, p2, atol=1e-15)
|
341
|
+
|
342
|
+
def test_detrend_external(self):
|
343
|
+
x = np.arange(10, dtype=np.float64) + 0.04
|
344
|
+
f, p = welch(x, nperseg=10,
|
345
|
+
detrend=lambda seg: signal.detrend(seg, type='l'))
|
346
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
347
|
+
|
348
|
+
def test_detrend_external_nd_m1(self):
|
349
|
+
x = np.arange(40, dtype=np.float64) + 0.04
|
350
|
+
x = x.reshape((2,2,10))
|
351
|
+
f, p = welch(x, nperseg=10,
|
352
|
+
detrend=lambda seg: signal.detrend(seg, type='l'))
|
353
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
354
|
+
|
355
|
+
def test_detrend_external_nd_0(self):
|
356
|
+
x = np.arange(20, dtype=np.float64) + 0.04
|
357
|
+
x = x.reshape((2,1,10))
|
358
|
+
x = np.moveaxis(x, 2, 0)
|
359
|
+
f, p = welch(x, nperseg=10, axis=0,
|
360
|
+
detrend=lambda seg: signal.detrend(seg, axis=0, type='l'))
|
361
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
362
|
+
|
363
|
+
def test_nd_axis_m1(self):
|
364
|
+
x = np.arange(20, dtype=np.float64) + 0.04
|
365
|
+
x = x.reshape((2,1,10))
|
366
|
+
f, p = welch(x, nperseg=10)
|
367
|
+
assert_array_equal(p.shape, (2, 1, 6))
|
368
|
+
assert_allclose(p[0,0,:], p[1,0,:], atol=1e-13, rtol=1e-13)
|
369
|
+
f0, p0 = welch(x[0,0,:], nperseg=10)
|
370
|
+
assert_allclose(p0[np.newaxis,:], p[1,:], atol=1e-13, rtol=1e-13)
|
371
|
+
|
372
|
+
def test_nd_axis_0(self):
|
373
|
+
x = np.arange(20, dtype=np.float64) + 0.04
|
374
|
+
x = x.reshape((10,2,1))
|
375
|
+
f, p = welch(x, nperseg=10, axis=0)
|
376
|
+
assert_array_equal(p.shape, (6,2,1))
|
377
|
+
assert_allclose(p[:,0,0], p[:,1,0], atol=1e-13, rtol=1e-13)
|
378
|
+
f0, p0 = welch(x[:,0,0], nperseg=10)
|
379
|
+
assert_allclose(p0, p[:,1,0], atol=1e-13, rtol=1e-13)
|
380
|
+
|
381
|
+
def test_window_external(self):
|
382
|
+
x = np.zeros(16)
|
383
|
+
x[0] = 1
|
384
|
+
x[8] = 1
|
385
|
+
f, p = welch(x, 10, 'hann', nperseg=8)
|
386
|
+
win = signal.get_window('hann', 8)
|
387
|
+
fe, pe = welch(x, 10, win, nperseg=None)
|
388
|
+
assert_array_almost_equal_nulp(p, pe)
|
389
|
+
assert_array_almost_equal_nulp(f, fe)
|
390
|
+
assert_array_equal(fe.shape, (5,)) # because win length used as nperseg
|
391
|
+
assert_array_equal(pe.shape, (5,))
|
392
|
+
assert_raises(ValueError, welch, x,
|
393
|
+
10, win, nperseg=4) # because nperseg != win.shape[-1]
|
394
|
+
win_err = signal.get_window('hann', 32)
|
395
|
+
assert_raises(ValueError, welch, x,
|
396
|
+
10, win_err, nperseg=None) # win longer than signal
|
397
|
+
|
398
|
+
def test_empty_input(self):
|
399
|
+
f, p = welch([])
|
400
|
+
assert_array_equal(f.shape, (0,))
|
401
|
+
assert_array_equal(p.shape, (0,))
|
402
|
+
for shape in [(0,), (3,0), (0,5,2)]:
|
403
|
+
f, p = welch(np.empty(shape))
|
404
|
+
assert_array_equal(f.shape, shape)
|
405
|
+
assert_array_equal(p.shape, shape)
|
406
|
+
|
407
|
+
def test_empty_input_other_axis(self):
|
408
|
+
for shape in [(3,0), (0,5,2)]:
|
409
|
+
f, p = welch(np.empty(shape), axis=1)
|
410
|
+
assert_array_equal(f.shape, shape)
|
411
|
+
assert_array_equal(p.shape, shape)
|
412
|
+
|
413
|
+
def test_short_data(self):
|
414
|
+
x = np.zeros(8)
|
415
|
+
x[0] = 1
|
416
|
+
#for string-like window, input signal length < nperseg value gives
|
417
|
+
#UserWarning, sets nperseg to x.shape[-1]
|
418
|
+
with suppress_warnings() as sup:
|
419
|
+
sup.filter(UserWarning, "nperseg=256 is greater than signal.*")
|
420
|
+
f, p = welch(x,window='hann') # default nperseg
|
421
|
+
f1, p1 = welch(x,window='hann', nperseg=256) # user-specified nperseg
|
422
|
+
f2, p2 = welch(x, nperseg=8) # valid nperseg, doesn't give warning
|
423
|
+
assert_allclose(f, f2)
|
424
|
+
assert_allclose(p, p2)
|
425
|
+
assert_allclose(f1, f2)
|
426
|
+
assert_allclose(p1, p2)
|
427
|
+
|
428
|
+
def test_window_long_or_nd(self):
|
429
|
+
assert_raises(ValueError, welch, np.zeros(4), 1, np.array([1,1,1,1,1]))
|
430
|
+
assert_raises(ValueError, welch, np.zeros(4), 1,
|
431
|
+
np.arange(6).reshape((2,3)))
|
432
|
+
|
433
|
+
def test_nondefault_noverlap(self):
|
434
|
+
x = np.zeros(64)
|
435
|
+
x[::8] = 1
|
436
|
+
f, p = welch(x, nperseg=16, noverlap=4)
|
437
|
+
q = np.array([0, 1./12., 1./3., 1./5., 1./3., 1./5., 1./3., 1./5.,
|
438
|
+
1./6.])
|
439
|
+
assert_allclose(p, q, atol=1e-12)
|
440
|
+
|
441
|
+
def test_bad_noverlap(self):
|
442
|
+
assert_raises(ValueError, welch, np.zeros(4), 1, 'hann', 2, 7)
|
443
|
+
|
444
|
+
def test_nfft_too_short(self):
|
445
|
+
assert_raises(ValueError, welch, np.ones(12), nfft=3, nperseg=4)
|
446
|
+
|
447
|
+
def test_real_onesided_even_32(self):
|
448
|
+
x = np.zeros(16, 'f')
|
449
|
+
x[0] = 1
|
450
|
+
x[8] = 1
|
451
|
+
f, p = welch(x, nperseg=8)
|
452
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
453
|
+
q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
|
454
|
+
0.11111111], 'f')
|
455
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
456
|
+
assert_(p.dtype == q.dtype)
|
457
|
+
|
458
|
+
def test_real_onesided_odd_32(self):
|
459
|
+
x = np.zeros(16, 'f')
|
460
|
+
x[0] = 1
|
461
|
+
x[8] = 1
|
462
|
+
f, p = welch(x, nperseg=9)
|
463
|
+
assert_allclose(f, np.arange(5.0)/9.0)
|
464
|
+
q = np.array([0.12477458, 0.23430935, 0.17072113, 0.17072116,
|
465
|
+
0.17072113], 'f')
|
466
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
467
|
+
assert_(p.dtype == q.dtype)
|
468
|
+
|
469
|
+
def test_real_twosided_32(self):
|
470
|
+
x = np.zeros(16, 'f')
|
471
|
+
x[0] = 1
|
472
|
+
x[8] = 1
|
473
|
+
f, p = welch(x, nperseg=8, return_onesided=False)
|
474
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
475
|
+
q = np.array([0.08333333, 0.07638889, 0.11111111,
|
476
|
+
0.11111111, 0.11111111, 0.11111111, 0.11111111,
|
477
|
+
0.07638889], 'f')
|
478
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
479
|
+
assert_(p.dtype == q.dtype)
|
480
|
+
|
481
|
+
def test_complex_32(self):
|
482
|
+
x = np.zeros(16, 'F')
|
483
|
+
x[0] = 1.0 + 2.0j
|
484
|
+
x[8] = 1.0 + 2.0j
|
485
|
+
f, p = welch(x, nperseg=8, return_onesided=False)
|
486
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
487
|
+
q = np.array([0.41666666, 0.38194442, 0.55555552, 0.55555552,
|
488
|
+
0.55555558, 0.55555552, 0.55555552, 0.38194442], 'f')
|
489
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
490
|
+
assert_(p.dtype == q.dtype,
|
491
|
+
f'dtype mismatch, {p.dtype}, {q.dtype}')
|
492
|
+
|
493
|
+
def test_padded_freqs(self):
|
494
|
+
x = np.zeros(12)
|
495
|
+
|
496
|
+
nfft = 24
|
497
|
+
f = fftfreq(nfft, 1.0)[:nfft//2+1]
|
498
|
+
f[-1] *= -1
|
499
|
+
fodd, _ = welch(x, nperseg=5, nfft=nfft)
|
500
|
+
feven, _ = welch(x, nperseg=6, nfft=nfft)
|
501
|
+
assert_allclose(f, fodd)
|
502
|
+
assert_allclose(f, feven)
|
503
|
+
|
504
|
+
nfft = 25
|
505
|
+
f = fftfreq(nfft, 1.0)[:(nfft + 1)//2]
|
506
|
+
fodd, _ = welch(x, nperseg=5, nfft=nfft)
|
507
|
+
feven, _ = welch(x, nperseg=6, nfft=nfft)
|
508
|
+
assert_allclose(f, fodd)
|
509
|
+
assert_allclose(f, feven)
|
510
|
+
|
511
|
+
def test_window_correction(self):
|
512
|
+
A = 20
|
513
|
+
fs = 1e4
|
514
|
+
nperseg = int(fs//10)
|
515
|
+
fsig = 300
|
516
|
+
ii = int(fsig*nperseg//fs) # Freq index of fsig
|
517
|
+
|
518
|
+
tt = np.arange(fs)/fs
|
519
|
+
x = A*np.sin(2*np.pi*fsig*tt)
|
520
|
+
|
521
|
+
for window in ['hann', 'bartlett', ('tukey', 0.1), 'flattop']:
|
522
|
+
_, p_spec = welch(x, fs=fs, nperseg=nperseg, window=window,
|
523
|
+
scaling='spectrum')
|
524
|
+
freq, p_dens = welch(x, fs=fs, nperseg=nperseg, window=window,
|
525
|
+
scaling='density')
|
526
|
+
|
527
|
+
# Check peak height at signal frequency for 'spectrum'
|
528
|
+
assert_allclose(p_spec[ii], A**2/2.0)
|
529
|
+
# Check integrated spectrum RMS for 'density'
|
530
|
+
assert_allclose(np.sqrt(trapezoid(p_dens, freq)), A*np.sqrt(2)/2,
|
531
|
+
rtol=1e-3)
|
532
|
+
|
533
|
+
def test_axis_rolling(self):
|
534
|
+
np.random.seed(1234)
|
535
|
+
|
536
|
+
x_flat = np.random.randn(1024)
|
537
|
+
_, p_flat = welch(x_flat)
|
538
|
+
|
539
|
+
for a in range(3):
|
540
|
+
newshape = [1,]*3
|
541
|
+
newshape[a] = -1
|
542
|
+
x = x_flat.reshape(newshape)
|
543
|
+
|
544
|
+
_, p_plus = welch(x, axis=a) # Positive axis index
|
545
|
+
_, p_minus = welch(x, axis=a-x.ndim) # Negative axis index
|
546
|
+
|
547
|
+
assert_equal(p_flat, p_plus.squeeze(), err_msg=a)
|
548
|
+
assert_equal(p_flat, p_minus.squeeze(), err_msg=a-x.ndim)
|
549
|
+
|
550
|
+
def test_average(self):
|
551
|
+
x = np.zeros(16)
|
552
|
+
x[0] = 1
|
553
|
+
x[8] = 1
|
554
|
+
f, p = welch(x, nperseg=8, average='median')
|
555
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
556
|
+
q = np.array([.1, .05, 0., 1.54074396e-33, 0.])
|
557
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
558
|
+
|
559
|
+
assert_raises(ValueError, welch, x, nperseg=8,
|
560
|
+
average='unrecognised-average')
|
561
|
+
|
562
|
+
def test_ratio_scale_to(self):
|
563
|
+
"""Verify the factor of ``sum(abs(window)**2)*fs / abs(sum(window))**2``
|
564
|
+
used in the `welch` and `csd` docstrs. """
|
565
|
+
x, win, fs = np.array([1., 0, 0, 0]), np.ones(4), 12
|
566
|
+
params = dict(fs=fs, window=win, return_onesided=False, detrend=None)
|
567
|
+
p_dens = welch(x, scaling='density', **params)[1]
|
568
|
+
p_spec = welch(x, scaling='spectrum', **params)[1]
|
569
|
+
p_fac = sum(win**2)*fs / abs(sum(win))**2
|
570
|
+
assert_allclose(p_spec / p_dens, p_fac)
|
571
|
+
|
572
|
+
class TestCSD:
|
573
|
+
def test_pad_shorter_x(self):
|
574
|
+
x = np.zeros(8)
|
575
|
+
y = np.zeros(12)
|
576
|
+
|
577
|
+
f = np.linspace(0, 0.5, 7)
|
578
|
+
c = np.zeros(7,dtype=np.complex128)
|
579
|
+
f1, c1 = csd(x, y, nperseg=12)
|
580
|
+
|
581
|
+
assert_allclose(f, f1)
|
582
|
+
assert_allclose(c, c1)
|
583
|
+
|
584
|
+
def test_pad_shorter_y(self):
|
585
|
+
x = np.zeros(12)
|
586
|
+
y = np.zeros(8)
|
587
|
+
|
588
|
+
f = np.linspace(0, 0.5, 7)
|
589
|
+
c = np.zeros(7,dtype=np.complex128)
|
590
|
+
f1, c1 = csd(x, y, nperseg=12)
|
591
|
+
|
592
|
+
assert_allclose(f, f1)
|
593
|
+
assert_allclose(c, c1)
|
594
|
+
|
595
|
+
def test_unequal_length_input_1D(self):
|
596
|
+
"""Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 1d arrays.
|
597
|
+
|
598
|
+
This test ensures that issue 23036 is fixed.
|
599
|
+
"""
|
600
|
+
x = np.tile([4, 0, -4, 0], 4)
|
601
|
+
|
602
|
+
kw = dict(fs=len(x), window='boxcar', nperseg=4)
|
603
|
+
X0 = signal.csd(x, np.copy(x), **kw)[1] # `x is x` must be False
|
604
|
+
X1 = signal.csd(x, x[:8], **kw)[1]
|
605
|
+
X2 = signal.csd(x[:8], x, **kw)[1]
|
606
|
+
xp_assert_close(X1, X0 / 2)
|
607
|
+
xp_assert_close(X2, X0 / 2)
|
608
|
+
|
609
|
+
def test_unequal_length_input_3D(self):
|
610
|
+
"""Test zero-padding for input `x.shape[axis] != y.shape[axis]` for 3d arrays.
|
611
|
+
|
612
|
+
This test ensures that issue 23036 is fixed.
|
613
|
+
"""
|
614
|
+
n = 8
|
615
|
+
x = np.zeros(2 * 3 * n).reshape(2, n, 3)
|
616
|
+
x[:, 0, :] = n
|
617
|
+
|
618
|
+
kw = dict(fs=n, window='boxcar', nperseg=n, detrend=None, axis=1)
|
619
|
+
X0 = signal.csd(x, x.copy(), **kw)[1] # `x is x` must be False
|
620
|
+
X1 = signal.csd(x, x[:, :2, :], **kw)[1]
|
621
|
+
X2 = signal.csd(x[:, :2, :], x, **kw)[1]
|
622
|
+
xp_assert_close(X1, X0)
|
623
|
+
xp_assert_close(X2, X0)
|
624
|
+
|
625
|
+
def test_real_onesided_even(self):
|
626
|
+
x = np.zeros(16)
|
627
|
+
x[0] = 1
|
628
|
+
x[8] = 1
|
629
|
+
f, p = csd(x, x, nperseg=8)
|
630
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
631
|
+
q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
|
632
|
+
0.11111111])
|
633
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
634
|
+
|
635
|
+
def test_real_onesided_odd(self):
|
636
|
+
x = np.zeros(16)
|
637
|
+
x[0] = 1
|
638
|
+
x[8] = 1
|
639
|
+
f, p = csd(x, x, nperseg=9)
|
640
|
+
assert_allclose(f, np.arange(5.0)/9.0)
|
641
|
+
q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
|
642
|
+
0.17072113])
|
643
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
644
|
+
|
645
|
+
def test_real_twosided(self):
|
646
|
+
x = np.zeros(16)
|
647
|
+
x[0] = 1
|
648
|
+
x[8] = 1
|
649
|
+
f, p = csd(x, x, nperseg=8, return_onesided=False)
|
650
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
651
|
+
q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
|
652
|
+
0.11111111, 0.11111111, 0.11111111, 0.07638889])
|
653
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
654
|
+
|
655
|
+
def test_real_spectrum(self):
|
656
|
+
x = np.zeros(16)
|
657
|
+
x[0] = 1
|
658
|
+
x[8] = 1
|
659
|
+
f, p = csd(x, x, nperseg=8, scaling='spectrum')
|
660
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
661
|
+
q = np.array([0.015625, 0.02864583, 0.04166667, 0.04166667,
|
662
|
+
0.02083333])
|
663
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
664
|
+
|
665
|
+
def test_integer_onesided_even(self):
|
666
|
+
x = np.zeros(16, dtype=int)
|
667
|
+
x[0] = 1
|
668
|
+
x[8] = 1
|
669
|
+
f, p = csd(x, x, nperseg=8)
|
670
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
671
|
+
q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
|
672
|
+
0.11111111])
|
673
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
674
|
+
|
675
|
+
def test_integer_onesided_odd(self):
|
676
|
+
x = np.zeros(16, dtype=int)
|
677
|
+
x[0] = 1
|
678
|
+
x[8] = 1
|
679
|
+
f, p = csd(x, x, nperseg=9)
|
680
|
+
assert_allclose(f, np.arange(5.0)/9.0)
|
681
|
+
q = np.array([0.12477455, 0.23430933, 0.17072113, 0.17072113,
|
682
|
+
0.17072113])
|
683
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
684
|
+
|
685
|
+
def test_integer_twosided(self):
|
686
|
+
x = np.zeros(16, dtype=int)
|
687
|
+
x[0] = 1
|
688
|
+
x[8] = 1
|
689
|
+
f, p = csd(x, x, nperseg=8, return_onesided=False)
|
690
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
691
|
+
q = np.array([0.08333333, 0.07638889, 0.11111111, 0.11111111,
|
692
|
+
0.11111111, 0.11111111, 0.11111111, 0.07638889])
|
693
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
694
|
+
|
695
|
+
def test_complex(self):
|
696
|
+
x = np.zeros(16, np.complex128)
|
697
|
+
x[0] = 1.0 + 2.0j
|
698
|
+
x[8] = 1.0 + 2.0j
|
699
|
+
f, p = csd(x, x, nperseg=8, return_onesided=False)
|
700
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
701
|
+
q = np.array([0.41666667, 0.38194444, 0.55555556, 0.55555556,
|
702
|
+
0.55555556, 0.55555556, 0.55555556, 0.38194444])
|
703
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
704
|
+
|
705
|
+
def test_unk_scaling(self):
|
706
|
+
assert_raises(ValueError, csd, np.zeros(4, np.complex128),
|
707
|
+
np.ones(4, np.complex128), scaling='foo', nperseg=4)
|
708
|
+
|
709
|
+
def test_detrend_linear(self):
|
710
|
+
x = np.arange(10, dtype=np.float64) + 0.04
|
711
|
+
f, p = csd(x, x, nperseg=10, detrend='linear')
|
712
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
713
|
+
|
714
|
+
def test_no_detrending(self):
|
715
|
+
x = np.arange(10, dtype=np.float64) + 0.04
|
716
|
+
f1, p1 = csd(x, x, nperseg=10, detrend=False)
|
717
|
+
f2, p2 = csd(x, x, nperseg=10, detrend=lambda x: x)
|
718
|
+
assert_allclose(f1, f2, atol=1e-15)
|
719
|
+
assert_allclose(p1, p2, atol=1e-15)
|
720
|
+
|
721
|
+
def test_detrend_external(self):
|
722
|
+
x = np.arange(10, dtype=np.float64) + 0.04
|
723
|
+
f, p = csd(x, x, nperseg=10,
|
724
|
+
detrend=lambda seg: signal.detrend(seg, type='l'))
|
725
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
726
|
+
|
727
|
+
def test_detrend_external_nd_m1(self):
|
728
|
+
x = np.arange(40, dtype=np.float64) + 0.04
|
729
|
+
x = x.reshape((2,2,10))
|
730
|
+
f, p = csd(x, x, nperseg=10,
|
731
|
+
detrend=lambda seg: signal.detrend(seg, type='l'))
|
732
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
733
|
+
|
734
|
+
def test_detrend_external_nd_0(self):
|
735
|
+
x = np.arange(20, dtype=np.float64) + 0.04
|
736
|
+
x = x.reshape((2,1,10))
|
737
|
+
x = np.moveaxis(x, 2, 0)
|
738
|
+
f, p = csd(x, x, nperseg=10, axis=0,
|
739
|
+
detrend=lambda seg: signal.detrend(seg, axis=0, type='l'))
|
740
|
+
assert_allclose(p, np.zeros_like(p), atol=1e-15)
|
741
|
+
|
742
|
+
def test_nd_axis_m1(self):
|
743
|
+
x = np.arange(20, dtype=np.float64) + 0.04
|
744
|
+
x = x.reshape((2,1,10))
|
745
|
+
f, p = csd(x, x, nperseg=10)
|
746
|
+
assert_array_equal(p.shape, (2, 1, 6))
|
747
|
+
assert_allclose(p[0,0,:], p[1,0,:], atol=1e-13, rtol=1e-13)
|
748
|
+
f0, p0 = csd(x[0,0,:], x[0,0,:], nperseg=10)
|
749
|
+
assert_allclose(p0[np.newaxis,:], p[1,:], atol=1e-13, rtol=1e-13)
|
750
|
+
|
751
|
+
def test_nd_axis_0(self):
|
752
|
+
x = np.arange(20, dtype=np.float64) + 0.04
|
753
|
+
x = x.reshape((10,2,1))
|
754
|
+
f, p = csd(x, x, nperseg=10, axis=0)
|
755
|
+
assert_array_equal(p.shape, (6,2,1))
|
756
|
+
assert_allclose(p[:,0,0], p[:,1,0], atol=1e-13, rtol=1e-13)
|
757
|
+
f0, p0 = csd(x[:,0,0], x[:,0,0], nperseg=10)
|
758
|
+
assert_allclose(p0, p[:,1,0], atol=1e-13, rtol=1e-13)
|
759
|
+
|
760
|
+
def test_window_external(self):
|
761
|
+
x = np.zeros(16)
|
762
|
+
x[0] = 1
|
763
|
+
x[8] = 1
|
764
|
+
f, p = csd(x, x, 10, 'hann', 8)
|
765
|
+
win = signal.get_window('hann', 8)
|
766
|
+
fe, pe = csd(x, x, 10, win, nperseg=None)
|
767
|
+
assert_array_almost_equal_nulp(p, pe)
|
768
|
+
assert_array_almost_equal_nulp(f, fe)
|
769
|
+
assert_array_equal(fe.shape, (5,)) # because win length used as nperseg
|
770
|
+
assert_array_equal(pe.shape, (5,))
|
771
|
+
assert_raises(ValueError, csd, x, x,
|
772
|
+
10, win, nperseg=256) # because nperseg != win.shape[-1]
|
773
|
+
win_err = signal.get_window('hann', 32)
|
774
|
+
assert_raises(ValueError, csd, x, x,
|
775
|
+
10, win_err, nperseg=None) # because win longer than signal
|
776
|
+
with pytest.raises(ValueError, match="Parameter nperseg=0.*"):
|
777
|
+
csd(x, x, 0, nperseg=0)
|
778
|
+
|
779
|
+
def test_empty_input(self):
|
780
|
+
f, p = csd([],np.zeros(10))
|
781
|
+
assert_array_equal(f.shape, (0,))
|
782
|
+
assert_array_equal(p.shape, (0,))
|
783
|
+
|
784
|
+
f, p = csd(np.zeros(10),[])
|
785
|
+
assert_array_equal(f.shape, (0,))
|
786
|
+
assert_array_equal(p.shape, (0,))
|
787
|
+
|
788
|
+
for shape in [(0,), (3,0), (0,5,2)]:
|
789
|
+
f, p = csd(np.empty(shape), np.empty(shape))
|
790
|
+
assert_array_equal(f.shape, shape)
|
791
|
+
assert_array_equal(p.shape, shape)
|
792
|
+
|
793
|
+
f, p = csd(np.ones(10), np.empty((5,0)))
|
794
|
+
assert_array_equal(f.shape, (5,0))
|
795
|
+
assert_array_equal(p.shape, (5,0))
|
796
|
+
|
797
|
+
f, p = csd(np.empty((5,0)), np.ones(10))
|
798
|
+
assert_array_equal(f.shape, (5,0))
|
799
|
+
assert_array_equal(p.shape, (5,0))
|
800
|
+
|
801
|
+
def test_empty_input_other_axis(self):
|
802
|
+
for shape in [(3,0), (0,5,2)]:
|
803
|
+
f, p = csd(np.empty(shape), np.empty(shape), axis=1)
|
804
|
+
assert_array_equal(f.shape, shape)
|
805
|
+
assert_array_equal(p.shape, shape)
|
806
|
+
|
807
|
+
f, p = csd(np.empty((10,10,3)), np.zeros((10,0,1)), axis=1)
|
808
|
+
assert_array_equal(f.shape, (10,0,3))
|
809
|
+
assert_array_equal(p.shape, (10,0,3))
|
810
|
+
|
811
|
+
f, p = csd(np.empty((10,0,1)), np.zeros((10,10,3)), axis=1)
|
812
|
+
assert_array_equal(f.shape, (10,0,3))
|
813
|
+
assert_array_equal(p.shape, (10,0,3))
|
814
|
+
|
815
|
+
def test_short_data(self):
|
816
|
+
x = np.zeros(8)
|
817
|
+
x[0] = 1
|
818
|
+
|
819
|
+
#for string-like window, input signal length < nperseg value gives
|
820
|
+
#UserWarning, sets nperseg to x.shape[-1]
|
821
|
+
with suppress_warnings() as sup:
|
822
|
+
sup.filter(UserWarning, "nperseg=256 is greater than signal length.*")
|
823
|
+
f, p = csd(x, x, window='hann') # default nperseg
|
824
|
+
f1, p1 = csd(x, x, window='hann', nperseg=256) # user-specified nperseg
|
825
|
+
f2, p2 = csd(x, x, nperseg=8) # valid nperseg, doesn't give warning
|
826
|
+
assert_allclose(f, f2)
|
827
|
+
assert_allclose(p, p2)
|
828
|
+
assert_allclose(f1, f2)
|
829
|
+
assert_allclose(p1, p2)
|
830
|
+
|
831
|
+
def test_window_long_or_nd(self):
|
832
|
+
assert_raises(ValueError, csd, np.zeros(4), np.ones(4), 1,
|
833
|
+
np.array([1,1,1,1,1]))
|
834
|
+
assert_raises(ValueError, csd, np.zeros(4), np.ones(4), 1,
|
835
|
+
np.arange(6).reshape((2,3)))
|
836
|
+
|
837
|
+
def test_nondefault_noverlap(self):
|
838
|
+
x = np.zeros(64)
|
839
|
+
x[::8] = 1
|
840
|
+
f, p = csd(x, x, nperseg=16, noverlap=4)
|
841
|
+
q = np.array([0, 1./12., 1./3., 1./5., 1./3., 1./5., 1./3., 1./5.,
|
842
|
+
1./6.])
|
843
|
+
assert_allclose(p, q, atol=1e-12)
|
844
|
+
|
845
|
+
def test_bad_noverlap(self):
|
846
|
+
assert_raises(ValueError, csd, np.zeros(4), np.ones(4), 1, 'hann',
|
847
|
+
2, 7)
|
848
|
+
|
849
|
+
def test_nfft_too_short(self):
|
850
|
+
assert_raises(ValueError, csd, np.ones(12), np.zeros(12), nfft=3,
|
851
|
+
nperseg=4)
|
852
|
+
|
853
|
+
def test_incompatible_inputs(self):
|
854
|
+
with pytest.raises(ValueError, match='x and y cannot be broadcast.*'):
|
855
|
+
csd(np.ones((1, 8, 1)), np.ones((2, 8)), nperseg=4)
|
856
|
+
|
857
|
+
|
858
|
+
def test_real_onesided_even_32(self):
|
859
|
+
x = np.zeros(16, 'f')
|
860
|
+
x[0] = 1
|
861
|
+
x[8] = 1
|
862
|
+
f, p = csd(x, x, nperseg=8)
|
863
|
+
assert_allclose(f, np.linspace(0, 0.5, 5))
|
864
|
+
q = np.array([0.08333333, 0.15277778, 0.22222222, 0.22222222,
|
865
|
+
0.11111111], 'f')
|
866
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
867
|
+
assert_(p.dtype == q.dtype)
|
868
|
+
|
869
|
+
def test_real_onesided_odd_32(self):
|
870
|
+
x = np.zeros(16, 'f')
|
871
|
+
x[0] = 1
|
872
|
+
x[8] = 1
|
873
|
+
f, p = csd(x, x, nperseg=9)
|
874
|
+
assert_allclose(f, np.arange(5.0)/9.0)
|
875
|
+
q = np.array([0.12477458, 0.23430935, 0.17072113, 0.17072116,
|
876
|
+
0.17072113], 'f')
|
877
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
878
|
+
assert_(p.dtype == q.dtype)
|
879
|
+
|
880
|
+
def test_real_twosided_32(self):
|
881
|
+
x = np.zeros(16, 'f')
|
882
|
+
x[0] = 1
|
883
|
+
x[8] = 1
|
884
|
+
f, p = csd(x, x, nperseg=8, return_onesided=False)
|
885
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
886
|
+
q = np.array([0.08333333, 0.07638889, 0.11111111,
|
887
|
+
0.11111111, 0.11111111, 0.11111111, 0.11111111,
|
888
|
+
0.07638889], 'f')
|
889
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
890
|
+
assert_(p.dtype == q.dtype)
|
891
|
+
|
892
|
+
def test_complex_32(self):
|
893
|
+
x = np.zeros(16, 'F')
|
894
|
+
x[0] = 1.0 + 2.0j
|
895
|
+
x[8] = 1.0 + 2.0j
|
896
|
+
f, p = csd(x, x, nperseg=8, return_onesided=False)
|
897
|
+
assert_allclose(f, fftfreq(8, 1.0))
|
898
|
+
q = np.array([0.41666666, 0.38194442, 0.55555552, 0.55555552,
|
899
|
+
0.55555558, 0.55555552, 0.55555552, 0.38194442], 'f')
|
900
|
+
assert_allclose(p, q, atol=1e-7, rtol=1e-7)
|
901
|
+
assert_(p.dtype == q.dtype,
|
902
|
+
f'dtype mismatch, {p.dtype}, {q.dtype}')
|
903
|
+
|
904
|
+
def test_padded_freqs(self):
|
905
|
+
x = np.zeros(12)
|
906
|
+
y = np.ones(12)
|
907
|
+
|
908
|
+
nfft = 24
|
909
|
+
f = fftfreq(nfft, 1.0)[:nfft//2+1]
|
910
|
+
f[-1] *= -1
|
911
|
+
fodd, _ = csd(x, y, nperseg=5, nfft=nfft)
|
912
|
+
feven, _ = csd(x, y, nperseg=6, nfft=nfft)
|
913
|
+
assert_allclose(f, fodd)
|
914
|
+
assert_allclose(f, feven)
|
915
|
+
|
916
|
+
nfft = 25
|
917
|
+
f = fftfreq(nfft, 1.0)[:(nfft + 1)//2]
|
918
|
+
fodd, _ = csd(x, y, nperseg=5, nfft=nfft)
|
919
|
+
feven, _ = csd(x, y, nperseg=6, nfft=nfft)
|
920
|
+
assert_allclose(f, fodd)
|
921
|
+
assert_allclose(f, feven)
|
922
|
+
|
923
|
+
def test_copied_data(self):
|
924
|
+
x = np.random.randn(64)
|
925
|
+
y = x.copy()
|
926
|
+
|
927
|
+
_, p_same = csd(x, x, nperseg=8, average='mean',
|
928
|
+
return_onesided=False)
|
929
|
+
_, p_copied = csd(x, y, nperseg=8, average='mean',
|
930
|
+
return_onesided=False)
|
931
|
+
assert_allclose(p_same, p_copied)
|
932
|
+
|
933
|
+
_, p_same = csd(x, x, nperseg=8, average='median',
|
934
|
+
return_onesided=False)
|
935
|
+
_, p_copied = csd(x, y, nperseg=8, average='median',
|
936
|
+
return_onesided=False)
|
937
|
+
assert_allclose(p_same, p_copied)
|
938
|
+
|
939
|
+
|
940
|
+
class TestCoherence:
|
941
|
+
def test_identical_input(self):
|
942
|
+
x = np.random.randn(20)
|
943
|
+
y = np.copy(x) # So `y is x` -> False
|
944
|
+
|
945
|
+
f = np.linspace(0, 0.5, 6)
|
946
|
+
C = np.ones(6)
|
947
|
+
f1, C1 = coherence(x, y, nperseg=10)
|
948
|
+
|
949
|
+
assert_allclose(f, f1)
|
950
|
+
assert_allclose(C, C1)
|
951
|
+
|
952
|
+
def test_phase_shifted_input(self):
|
953
|
+
x = np.random.randn(20)
|
954
|
+
y = -x
|
955
|
+
|
956
|
+
f = np.linspace(0, 0.5, 6)
|
957
|
+
C = np.ones(6)
|
958
|
+
f1, C1 = coherence(x, y, nperseg=10)
|
959
|
+
|
960
|
+
assert_allclose(f, f1)
|
961
|
+
assert_allclose(C, C1)
|
962
|
+
|
963
|
+
|
964
|
+
class TestSpectrogram:
|
965
|
+
def test_average_all_segments(self):
|
966
|
+
x = np.random.randn(1024)
|
967
|
+
|
968
|
+
fs = 1.0
|
969
|
+
window = ('tukey', 0.25)
|
970
|
+
nperseg = 16
|
971
|
+
noverlap = 2
|
972
|
+
|
973
|
+
f, _, P = spectrogram(x, fs, window, nperseg, noverlap)
|
974
|
+
fw, Pw = welch(x, fs, window, nperseg, noverlap)
|
975
|
+
assert_allclose(f, fw)
|
976
|
+
assert_allclose(np.mean(P, axis=-1), Pw)
|
977
|
+
|
978
|
+
def test_window_external(self):
|
979
|
+
x = np.random.randn(1024)
|
980
|
+
|
981
|
+
fs = 1.0
|
982
|
+
window = ('tukey', 0.25)
|
983
|
+
nperseg = 16
|
984
|
+
noverlap = 2
|
985
|
+
f, _, P = spectrogram(x, fs, window, nperseg, noverlap)
|
986
|
+
|
987
|
+
win = signal.get_window(('tukey', 0.25), 16)
|
988
|
+
fe, _, Pe = spectrogram(x, fs, win, nperseg=None, noverlap=2)
|
989
|
+
assert_array_equal(fe.shape, (9,)) # because win length used as nperseg
|
990
|
+
assert_array_equal(Pe.shape, (9,73))
|
991
|
+
assert_raises(ValueError, spectrogram, x,
|
992
|
+
fs, win, nperseg=8) # because nperseg != win.shape[-1]
|
993
|
+
win_err = signal.get_window(('tukey', 0.25), 2048)
|
994
|
+
assert_raises(ValueError, spectrogram, x,
|
995
|
+
fs, win_err, nperseg=None) # win longer than signal
|
996
|
+
|
997
|
+
def test_short_data(self):
|
998
|
+
x = np.random.randn(1024)
|
999
|
+
fs = 1.0
|
1000
|
+
|
1001
|
+
#for string-like window, input signal length < nperseg value gives
|
1002
|
+
#UserWarning, sets nperseg to x.shape[-1]
|
1003
|
+
f, _, p = spectrogram(x, fs, window=('tukey',0.25)) # default nperseg
|
1004
|
+
with suppress_warnings() as sup:
|
1005
|
+
sup.filter(UserWarning,
|
1006
|
+
"nperseg = 1025 is greater than input length = 1024, "
|
1007
|
+
"using nperseg = 1024",)
|
1008
|
+
f1, _, p1 = spectrogram(x, fs, window=('tukey',0.25),
|
1009
|
+
nperseg=1025) # user-specified nperseg
|
1010
|
+
f2, _, p2 = spectrogram(x, fs, nperseg=256) # to compare w/default
|
1011
|
+
f3, _, p3 = spectrogram(x, fs, nperseg=1024) # compare w/user-spec'd
|
1012
|
+
assert_allclose(f, f2)
|
1013
|
+
assert_allclose(p, p2)
|
1014
|
+
assert_allclose(f1, f3)
|
1015
|
+
assert_allclose(p1, p3)
|
1016
|
+
|
1017
|
+
class TestLombscargle:
|
1018
|
+
def test_frequency(self):
|
1019
|
+
"""Test if frequency location of peak corresponds to frequency of
|
1020
|
+
generated input signal.
|
1021
|
+
"""
|
1022
|
+
|
1023
|
+
# Input parameters
|
1024
|
+
ampl = 2.
|
1025
|
+
w = 1.
|
1026
|
+
phi = 0.5 * np.pi
|
1027
|
+
nin = 100
|
1028
|
+
nout = 1000
|
1029
|
+
p = 0.7 # Fraction of points to select
|
1030
|
+
|
1031
|
+
# Randomly select a fraction of an array with timesteps
|
1032
|
+
rng = np.random.RandomState(2353425)
|
1033
|
+
r = rng.rand(nin)
|
1034
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1035
|
+
|
1036
|
+
# Plot a sine wave for the selected times
|
1037
|
+
y = ampl * np.sin(w*t + phi)
|
1038
|
+
|
1039
|
+
# Define the array of frequencies for which to compute the periodogram
|
1040
|
+
f = np.linspace(0.01, 10., nout)
|
1041
|
+
|
1042
|
+
# Calculate Lomb-Scargle periodogram
|
1043
|
+
P = lombscargle(t, y, f)
|
1044
|
+
|
1045
|
+
# Check if difference between found frequency maximum and input
|
1046
|
+
# frequency is less than accuracy
|
1047
|
+
delta = f[1] - f[0]
|
1048
|
+
assert(w - f[np.argmax(P)] < (delta/2.))
|
1049
|
+
|
1050
|
+
# also, check that it works with weights
|
1051
|
+
P = lombscargle(t, y, f, weights=np.ones_like(t, dtype=f.dtype))
|
1052
|
+
|
1053
|
+
# Check if difference between found frequency maximum and input
|
1054
|
+
# frequency is less than accuracy
|
1055
|
+
delta = f[1] - f[0]
|
1056
|
+
assert(w - f[np.argmax(P)] < (delta/2.))
|
1057
|
+
|
1058
|
+
|
1059
|
+
def test_amplitude(self):
|
1060
|
+
# Test if height of peak in unnormalized Lomb-Scargle periodogram
|
1061
|
+
# corresponds to amplitude of the generated input signal.
|
1062
|
+
|
1063
|
+
# Input parameters
|
1064
|
+
ampl = 2.
|
1065
|
+
w = 1.
|
1066
|
+
phi = 0.5 * np.pi
|
1067
|
+
nin = 1000
|
1068
|
+
nout = 1000
|
1069
|
+
p = 0.7 # Fraction of points to select
|
1070
|
+
|
1071
|
+
# Randomly select a fraction of an array with timesteps
|
1072
|
+
rng = np.random.RandomState(2353425)
|
1073
|
+
r = rng.rand(nin)
|
1074
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1075
|
+
|
1076
|
+
# Plot a sine wave for the selected times
|
1077
|
+
y = ampl * np.sin(w*t + phi)
|
1078
|
+
|
1079
|
+
# Define the array of frequencies for which to compute the periodogram
|
1080
|
+
f = np.linspace(0.01, 10., nout)
|
1081
|
+
|
1082
|
+
# Calculate Lomb-Scargle periodogram
|
1083
|
+
pgram = lombscargle(t, y, f)
|
1084
|
+
|
1085
|
+
# convert to the amplitude
|
1086
|
+
pgram = np.sqrt(4.0 * pgram / t.shape[0])
|
1087
|
+
|
1088
|
+
# Check if amplitude is correct (this will not exactly match, due to
|
1089
|
+
# numerical differences when data is removed)
|
1090
|
+
assert_allclose(pgram[f==w], ampl, rtol=5e-2)
|
1091
|
+
|
1092
|
+
def test_precenter(self):
|
1093
|
+
# Test if precenter gives the same result as manually precentering
|
1094
|
+
# (for a very simple offset)
|
1095
|
+
|
1096
|
+
# Input parameters
|
1097
|
+
ampl = 2.
|
1098
|
+
w = 1.
|
1099
|
+
phi = 0.5 * np.pi
|
1100
|
+
nin = 100
|
1101
|
+
nout = 1000
|
1102
|
+
p = 0.7 # Fraction of points to select
|
1103
|
+
offset = 0.15 # Offset to be subtracted in pre-centering
|
1104
|
+
|
1105
|
+
# Randomly select a fraction of an array with timesteps
|
1106
|
+
rng = np.random.RandomState(2353425)
|
1107
|
+
r = rng.rand(nin)
|
1108
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1109
|
+
|
1110
|
+
# Plot a sine wave for the selected times
|
1111
|
+
y = ampl * np.sin(w*t + phi) + offset
|
1112
|
+
|
1113
|
+
# Define the array of frequencies for which to compute the periodogram
|
1114
|
+
f = np.linspace(0.01, 10., nout)
|
1115
|
+
|
1116
|
+
# Calculate Lomb-Scargle periodogram
|
1117
|
+
pgram = lombscargle(t, y, f, precenter=True)
|
1118
|
+
pgram2 = lombscargle(t, y - y.mean(), f, precenter=False)
|
1119
|
+
|
1120
|
+
# check if centering worked
|
1121
|
+
assert_allclose(pgram, pgram2)
|
1122
|
+
|
1123
|
+
# do this again, but with floating_mean=True
|
1124
|
+
|
1125
|
+
# Calculate Lomb-Scargle periodogram
|
1126
|
+
pgram = lombscargle(t, y, f, precenter=True, floating_mean=True)
|
1127
|
+
pgram2 = lombscargle(t, y - y.mean(), f, precenter=False, floating_mean=True)
|
1128
|
+
|
1129
|
+
# check if centering worked
|
1130
|
+
assert_allclose(pgram, pgram2)
|
1131
|
+
|
1132
|
+
def test_normalize(self):
|
1133
|
+
# Test normalize option of Lomb-Scarge.
|
1134
|
+
|
1135
|
+
# Input parameters
|
1136
|
+
ampl = 2.
|
1137
|
+
w = 1.
|
1138
|
+
phi = 0.5 * np.pi
|
1139
|
+
nin = 100
|
1140
|
+
nout = 1000
|
1141
|
+
p = 0.7 # Fraction of points to select
|
1142
|
+
|
1143
|
+
# Randomly select a fraction of an array with timesteps
|
1144
|
+
rng = np.random.RandomState(2353425)
|
1145
|
+
r = rng.rand(nin)
|
1146
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1147
|
+
|
1148
|
+
# Plot a sine wave for the selected times
|
1149
|
+
y = ampl * np.sin(w*t + phi)
|
1150
|
+
|
1151
|
+
# Define the array of frequencies for which to compute the periodogram
|
1152
|
+
f = np.linspace(0.01, 10., nout)
|
1153
|
+
|
1154
|
+
# Calculate Lomb-Scargle periodogram
|
1155
|
+
pgram = lombscargle(t, y, f)
|
1156
|
+
pgram2 = lombscargle(t, y, f, normalize=True)
|
1157
|
+
|
1158
|
+
# Calculate the scale to convert from unnormalized to normalized
|
1159
|
+
weights = np.ones_like(t)/float(t.shape[0])
|
1160
|
+
YY_hat = (weights * y * y).sum()
|
1161
|
+
YY = YY_hat # correct formula for floating_mean=False
|
1162
|
+
scale_to_use = 2/(YY*t.shape[0])
|
1163
|
+
|
1164
|
+
# check if normalization works as expected
|
1165
|
+
assert_allclose(pgram * scale_to_use, pgram2)
|
1166
|
+
assert_allclose(np.max(pgram2), 1.0)
|
1167
|
+
|
1168
|
+
def test_wrong_shape(self):
|
1169
|
+
|
1170
|
+
# different length t and y
|
1171
|
+
t = np.linspace(0, 1, 1)
|
1172
|
+
y = np.linspace(0, 1, 2)
|
1173
|
+
f = np.linspace(0, 1, 3) + 0.1
|
1174
|
+
assert_raises(ValueError, lombscargle, t, y, f)
|
1175
|
+
|
1176
|
+
# t is 2D, with both axes length > 1
|
1177
|
+
t = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
|
1178
|
+
y = np.linspace(0, 1, 2)
|
1179
|
+
f = np.linspace(0, 1, 3) + 0.1
|
1180
|
+
assert_raises(ValueError, lombscargle, t, y, f)
|
1181
|
+
|
1182
|
+
# y is 2D, with both axes length > 1
|
1183
|
+
t = np.linspace(0, 1, 2)
|
1184
|
+
y = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
|
1185
|
+
f = np.linspace(0, 1, 3) + 0.1
|
1186
|
+
assert_raises(ValueError, lombscargle, t, y, f)
|
1187
|
+
|
1188
|
+
# f is 2D, with both axes length > 1
|
1189
|
+
t = np.linspace(0, 1, 2)
|
1190
|
+
y = np.linspace(0, 1, 2)
|
1191
|
+
f = np.repeat(np.expand_dims(np.linspace(0, 1, 3), 1) + 0.1, 2, axis=1)
|
1192
|
+
assert_raises(ValueError, lombscargle, t, y, f)
|
1193
|
+
|
1194
|
+
# weights is 2D, with both axes length > 1
|
1195
|
+
t = np.linspace(0, 1, 2)
|
1196
|
+
y = np.linspace(0, 1, 2)
|
1197
|
+
f = np.linspace(0, 1, 3) + 0.1
|
1198
|
+
weights = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
|
1199
|
+
assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
|
1200
|
+
|
1201
|
+
def test_lombscargle_atan_vs_atan2(self):
|
1202
|
+
# https://github.com/scipy/scipy/issues/3787
|
1203
|
+
# This raised a ZeroDivisionError.
|
1204
|
+
t = np.linspace(0, 10, 1000, endpoint=False)
|
1205
|
+
y = np.sin(4*t)
|
1206
|
+
f = np.linspace(0, 50, 500, endpoint=False) + 0.1
|
1207
|
+
lombscargle(t, y, f*2*np.pi)
|
1208
|
+
|
1209
|
+
def test_wrong_shape_weights(self):
|
1210
|
+
# Weights must be the same shape as t
|
1211
|
+
|
1212
|
+
t = np.linspace(0, 1, 1)
|
1213
|
+
y = np.linspace(0, 1, 1)
|
1214
|
+
f = np.linspace(0, 1, 3) + 0.1
|
1215
|
+
weights = np.linspace(1, 2, 2)
|
1216
|
+
assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
|
1217
|
+
|
1218
|
+
def test_zero_division_weights(self):
|
1219
|
+
# Weights cannot sum to 0
|
1220
|
+
|
1221
|
+
t = np.zeros(1)
|
1222
|
+
y = np.zeros(1)
|
1223
|
+
f = np.ones(1)
|
1224
|
+
weights = np.zeros(1)
|
1225
|
+
assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
|
1226
|
+
|
1227
|
+
def test_normalize_parameter(self):
|
1228
|
+
# Test the validity of the normalize parameter input
|
1229
|
+
|
1230
|
+
# Input parameters
|
1231
|
+
ampl = 2.
|
1232
|
+
w = 1.
|
1233
|
+
phi = 0
|
1234
|
+
nin = 100
|
1235
|
+
nout = 1000
|
1236
|
+
p = 0.7 # Fraction of points to select
|
1237
|
+
|
1238
|
+
# Randomly select a fraction of an array with timesteps
|
1239
|
+
rng = np.random.RandomState(2353425)
|
1240
|
+
r = rng.rand(nin)
|
1241
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1242
|
+
|
1243
|
+
# Plot a sine wave for the selected times
|
1244
|
+
y = ampl * np.sin(w*t + phi)
|
1245
|
+
|
1246
|
+
# Define the array of frequencies for which to compute the periodogram
|
1247
|
+
f = np.linspace(0.01, 10., nout)
|
1248
|
+
|
1249
|
+
# check each of the valid inputs
|
1250
|
+
pgram_false = lombscargle(t, y, f, normalize=False)
|
1251
|
+
pgram_true = lombscargle(t, y, f, normalize=True)
|
1252
|
+
pgram_power = lombscargle(t, y, f, normalize='power')
|
1253
|
+
pgram_norm = lombscargle(t, y, f, normalize='normalize')
|
1254
|
+
pgram_amp = lombscargle(t, y, f, normalize='amplitude')
|
1255
|
+
|
1256
|
+
# validate the results that should be the same
|
1257
|
+
assert_allclose(pgram_false, pgram_power)
|
1258
|
+
assert_allclose(pgram_true, pgram_norm)
|
1259
|
+
|
1260
|
+
# validate that the power and norm outputs are proper wrt each other
|
1261
|
+
weights = np.ones_like(y)/float(y.shape[0])
|
1262
|
+
YY_hat = (weights * y * y).sum()
|
1263
|
+
YY = YY_hat # correct formula for floating_mean=False
|
1264
|
+
assert_allclose(pgram_power * 2.0 / (float(t.shape[0]) * YY), pgram_norm)
|
1265
|
+
|
1266
|
+
# validate that the amp output is correct for the given input
|
1267
|
+
f_i = np.where(f==w)[0][0]
|
1268
|
+
assert_allclose(np.abs(pgram_amp[f_i]), ampl)
|
1269
|
+
|
1270
|
+
# check invalid inputs
|
1271
|
+
# 1) a string that is not allowed
|
1272
|
+
assert_raises(ValueError, lombscargle, t, y, f, normalize='lomb')
|
1273
|
+
# 2) something besides a bool or str
|
1274
|
+
assert_raises(ValueError, lombscargle, t, y, f, normalize=2)
|
1275
|
+
|
1276
|
+
def test_offset_removal(self):
|
1277
|
+
# Verify that the amplitude is the same, even with an offset
|
1278
|
+
# must use floating_mean=True, otherwise it will not remove an offset
|
1279
|
+
|
1280
|
+
# Input parameters
|
1281
|
+
ampl = 2.
|
1282
|
+
w = 1.
|
1283
|
+
phi = 0.5 * np.pi
|
1284
|
+
nin = 100
|
1285
|
+
nout = 1000
|
1286
|
+
p = 0.7 # Fraction of points to select
|
1287
|
+
offset = 2.15 # Large offset
|
1288
|
+
|
1289
|
+
# Randomly select a fraction of an array with timesteps
|
1290
|
+
rng = np.random.RandomState(2353425)
|
1291
|
+
r = rng.rand(nin)
|
1292
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1293
|
+
|
1294
|
+
# Plot a sine wave for the selected times
|
1295
|
+
y = ampl * np.sin(w*t + phi)
|
1296
|
+
|
1297
|
+
# Define the array of frequencies for which to compute the periodogram
|
1298
|
+
f = np.linspace(0.01, 10., nout)
|
1299
|
+
|
1300
|
+
# Calculate Lomb-Scargle periodogram
|
1301
|
+
pgram = lombscargle(t, y, f, floating_mean=True)
|
1302
|
+
pgram_offset = lombscargle(t, y + offset, f, floating_mean=True)
|
1303
|
+
|
1304
|
+
# check if offset removal works as expected
|
1305
|
+
assert_allclose(pgram, pgram_offset)
|
1306
|
+
|
1307
|
+
def test_floating_mean_false(self):
|
1308
|
+
# Verify that when disabling the floating_mean, the calculations are correct
|
1309
|
+
|
1310
|
+
# Input parameters
|
1311
|
+
ampl = 2.
|
1312
|
+
w = 1.
|
1313
|
+
phi = 0
|
1314
|
+
nin = 1000
|
1315
|
+
nout = 1000
|
1316
|
+
p = 0.7 # Fraction of points to select
|
1317
|
+
offset = 2 # Large offset
|
1318
|
+
|
1319
|
+
# Randomly select a fraction of an array with timesteps
|
1320
|
+
rng = np.random.RandomState(2353425)
|
1321
|
+
r = rng.rand(nin)
|
1322
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1323
|
+
|
1324
|
+
# Plot a cos wave for the selected times
|
1325
|
+
y = ampl * np.cos(w*t + phi)
|
1326
|
+
|
1327
|
+
# Define the array of frequencies for which to compute the periodogram
|
1328
|
+
f = np.linspace(0.01, 10., nout)
|
1329
|
+
|
1330
|
+
# Calculate Lomb-Scargle periodogram
|
1331
|
+
pgram = lombscargle(t, y, f, normalize=True, floating_mean=False)
|
1332
|
+
pgram_offset = lombscargle(t, y + offset, f, normalize=True,
|
1333
|
+
floating_mean=False)
|
1334
|
+
|
1335
|
+
# check if disabling floating_mean works as expected
|
1336
|
+
# nearly-zero for no offset, exact value will change based on seed
|
1337
|
+
assert(pgram[0] < 0.01)
|
1338
|
+
# significant value with offset, exact value will change based on seed
|
1339
|
+
assert(pgram_offset[0] > 0.5)
|
1340
|
+
|
1341
|
+
def test_amplitude_is_correct(self):
|
1342
|
+
# Verify that the amplitude is correct (when normalize='amplitude')
|
1343
|
+
|
1344
|
+
# Input parameters
|
1345
|
+
ampl = 2.
|
1346
|
+
w = 1.
|
1347
|
+
phi = 0.12
|
1348
|
+
nin = 100
|
1349
|
+
nout = 1000
|
1350
|
+
p = 0.7 # Fraction of points to select
|
1351
|
+
offset = 2.15 # Large offset
|
1352
|
+
|
1353
|
+
# Randomly select a fraction of an array with timesteps
|
1354
|
+
rng = np.random.RandomState(2353425)
|
1355
|
+
r = rng.rand(nin)
|
1356
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1357
|
+
|
1358
|
+
# Plot a sine wave for the selected times
|
1359
|
+
y = ampl * np.cos(w*t + phi) + offset
|
1360
|
+
|
1361
|
+
# Define the array of frequencies for which to compute the periodogram
|
1362
|
+
f = np.linspace(0.01, 10., nout)
|
1363
|
+
|
1364
|
+
# Get the index of where the exact result should be
|
1365
|
+
f_indx = np.where(f==w)[0][0]
|
1366
|
+
|
1367
|
+
# Calculate Lomb-Scargle periodogram (amplitude + phase)
|
1368
|
+
pgram = lombscargle(t, y, f, normalize='amplitude', floating_mean=True)
|
1369
|
+
|
1370
|
+
# Check if amplitude is correct
|
1371
|
+
assert_allclose(np.abs(pgram[f_indx]), ampl)
|
1372
|
+
|
1373
|
+
# Check if phase is correct
|
1374
|
+
# (phase angle is the negative of the phase offset)
|
1375
|
+
assert_allclose(-np.angle(pgram[f_indx]), phi)
|
1376
|
+
|
1377
|
+
def test_negative_weight(self):
|
1378
|
+
# Test that a negative weight produces an error
|
1379
|
+
|
1380
|
+
t = np.zeros(1)
|
1381
|
+
y = np.zeros(1)
|
1382
|
+
f = np.ones(1)
|
1383
|
+
weights = -np.ones(1)
|
1384
|
+
assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
|
1385
|
+
|
1386
|
+
def test_list_input(self):
|
1387
|
+
# Test that input can be passsed in as lists and with a numerical issue
|
1388
|
+
# https://github.com/scipy/scipy/issues/8787
|
1389
|
+
|
1390
|
+
t = [1.98201652e+09, 1.98201752e+09, 1.98201852e+09, 1.98201952e+09,
|
1391
|
+
1.98202052e+09, 1.98202152e+09, 1.98202252e+09, 1.98202352e+09,
|
1392
|
+
1.98202452e+09, 1.98202552e+09, 1.98202652e+09, 1.98202752e+09,
|
1393
|
+
1.98202852e+09, 1.98202952e+09, 1.98203052e+09, 1.98203152e+09,
|
1394
|
+
1.98203252e+09, 1.98203352e+09, 1.98203452e+09, 1.98203552e+09,
|
1395
|
+
1.98205452e+09, 1.98205552e+09, 1.98205652e+09, 1.98205752e+09,
|
1396
|
+
1.98205852e+09, 1.98205952e+09, 1.98206052e+09, 1.98206152e+09,
|
1397
|
+
1.98206252e+09, 1.98206352e+09, 1.98206452e+09, 1.98206552e+09,
|
1398
|
+
1.98206652e+09, 1.98206752e+09, 1.98206852e+09, 1.98206952e+09,
|
1399
|
+
1.98207052e+09, 1.98207152e+09, 1.98207252e+09, 1.98207352e+09,
|
1400
|
+
1.98209652e+09, 1.98209752e+09, 1.98209852e+09, 1.98209952e+09,
|
1401
|
+
1.98210052e+09, 1.98210152e+09, 1.98210252e+09, 1.98210352e+09,
|
1402
|
+
1.98210452e+09, 1.98210552e+09, 1.98210652e+09, 1.98210752e+09,
|
1403
|
+
1.98210852e+09, 1.98210952e+09, 1.98211052e+09, 1.98211152e+09,
|
1404
|
+
1.98211252e+09, 1.98211352e+09, 1.98211452e+09, 1.98211552e+09,
|
1405
|
+
1.98217252e+09, 1.98217352e+09, 1.98217452e+09, 1.98217552e+09,
|
1406
|
+
1.98217652e+09, 1.98217752e+09, 1.98217852e+09, 1.98217952e+09,
|
1407
|
+
1.98218052e+09, 1.98218152e+09, 1.98218252e+09, 1.98218352e+09,
|
1408
|
+
1.98218452e+09, 1.98218552e+09, 1.98218652e+09, 1.98218752e+09,
|
1409
|
+
1.98218852e+09, 1.98218952e+09, 1.98219052e+09, 1.98219152e+09,
|
1410
|
+
1.98219352e+09, 1.98219452e+09, 1.98219552e+09, 1.98219652e+09,
|
1411
|
+
1.98219752e+09, 1.98219852e+09, 1.98219952e+09, 1.98220052e+09,
|
1412
|
+
1.98220152e+09, 1.98220252e+09, 1.98220352e+09, 1.98220452e+09,
|
1413
|
+
1.98220552e+09, 1.98220652e+09, 1.98220752e+09, 1.98220852e+09,
|
1414
|
+
1.98220952e+09, 1.98221052e+09, 1.98221152e+09, 1.98221252e+09,
|
1415
|
+
1.98222752e+09, 1.98222852e+09, 1.98222952e+09, 1.98223052e+09,
|
1416
|
+
1.98223152e+09, 1.98223252e+09, 1.98223352e+09, 1.98223452e+09,
|
1417
|
+
1.98223552e+09, 1.98223652e+09, 1.98223752e+09, 1.98223852e+09,
|
1418
|
+
1.98223952e+09, 1.98224052e+09, 1.98224152e+09, 1.98224252e+09,
|
1419
|
+
1.98224352e+09, 1.98224452e+09, 1.98224552e+09, 1.98224652e+09,
|
1420
|
+
1.98224752e+09]
|
1421
|
+
y = [2.97600000e+03, 3.18200000e+03, 3.74900000e+03, 4.53500000e+03,
|
1422
|
+
5.43300000e+03, 6.38000000e+03, 7.34000000e+03, 8.29200000e+03,
|
1423
|
+
9.21900000e+03, 1.01120000e+04, 1.09620000e+04, 1.17600000e+04,
|
1424
|
+
1.25010000e+04, 1.31790000e+04, 1.37900000e+04, 1.43290000e+04,
|
1425
|
+
1.47940000e+04, 1.51800000e+04, 1.54870000e+04, 1.57110000e+04,
|
1426
|
+
5.74200000e+03, 4.82300000e+03, 3.99100000e+03, 3.33600000e+03,
|
1427
|
+
2.99600000e+03, 3.08400000e+03, 3.56700000e+03, 4.30700000e+03,
|
1428
|
+
5.18200000e+03, 6.11900000e+03, 7.07900000e+03, 8.03400000e+03,
|
1429
|
+
8.97000000e+03, 9.87300000e+03, 1.07350000e+04, 1.15480000e+04,
|
1430
|
+
1.23050000e+04, 1.30010000e+04, 1.36300000e+04, 1.41890000e+04,
|
1431
|
+
6.00000000e+03, 5.06800000e+03, 4.20500000e+03, 3.49000000e+03,
|
1432
|
+
3.04900000e+03, 3.01600000e+03, 3.40400000e+03, 4.08800000e+03,
|
1433
|
+
4.93500000e+03, 5.86000000e+03, 6.81700000e+03, 7.77500000e+03,
|
1434
|
+
8.71800000e+03, 9.63100000e+03, 1.05050000e+04, 1.13320000e+04,
|
1435
|
+
1.21050000e+04, 1.28170000e+04, 1.34660000e+04, 1.40440000e+04,
|
1436
|
+
1.32730000e+04, 1.26040000e+04, 1.18720000e+04, 1.10820000e+04,
|
1437
|
+
1.02400000e+04, 9.35300000e+03, 8.43000000e+03, 7.48100000e+03,
|
1438
|
+
6.52100000e+03, 5.57000000e+03, 4.66200000e+03, 3.85400000e+03,
|
1439
|
+
3.24600000e+03, 2.97900000e+03, 3.14700000e+03, 3.68800000e+03,
|
1440
|
+
4.45900000e+03, 5.35000000e+03, 6.29400000e+03, 7.25400000e+03,
|
1441
|
+
9.13800000e+03, 1.00340000e+04, 1.08880000e+04, 1.16910000e+04,
|
1442
|
+
1.24370000e+04, 1.31210000e+04, 1.37380000e+04, 1.42840000e+04,
|
1443
|
+
1.47550000e+04, 1.51490000e+04, 1.54630000e+04, 1.56950000e+04,
|
1444
|
+
1.58430000e+04, 1.59070000e+04, 1.58860000e+04, 1.57800000e+04,
|
1445
|
+
1.55910000e+04, 1.53190000e+04, 1.49650000e+04, 1.45330000e+04,
|
1446
|
+
3.01000000e+03, 3.05900000e+03, 3.51200000e+03, 4.23400000e+03,
|
1447
|
+
5.10000000e+03, 6.03400000e+03, 6.99300000e+03, 7.95000000e+03,
|
1448
|
+
8.88800000e+03, 9.79400000e+03, 1.06600000e+04, 1.14770000e+04,
|
1449
|
+
1.22400000e+04, 1.29410000e+04, 1.35770000e+04, 1.41430000e+04,
|
1450
|
+
1.46350000e+04, 1.50500000e+04, 1.53850000e+04, 1.56400000e+04,
|
1451
|
+
1.58110000e+04]
|
1452
|
+
|
1453
|
+
periods = np.linspace(400, 120, 1000)
|
1454
|
+
angular_freq = 2 * np.pi / periods
|
1455
|
+
|
1456
|
+
lombscargle(t, y, angular_freq, precenter=True, normalize=True)
|
1457
|
+
|
1458
|
+
def test_zero_freq(self):
|
1459
|
+
# Verify that function works when freqs includes 0
|
1460
|
+
# The value at f=0 will depend on the seed
|
1461
|
+
|
1462
|
+
# Input parameters
|
1463
|
+
ampl = 2.
|
1464
|
+
w = 1.
|
1465
|
+
phi = 0.12
|
1466
|
+
nin = 100
|
1467
|
+
nout = 1001
|
1468
|
+
p = 0.7 # Fraction of points to select
|
1469
|
+
offset = 0
|
1470
|
+
|
1471
|
+
# Randomly select a fraction of an array with timesteps
|
1472
|
+
rng = np.random.RandomState(2353425)
|
1473
|
+
r = rng.rand(nin)
|
1474
|
+
t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
|
1475
|
+
|
1476
|
+
# Plot a sine wave for the selected times
|
1477
|
+
y = ampl * np.cos(w*t + phi) + offset
|
1478
|
+
|
1479
|
+
# Define the array of frequencies for which to compute the periodogram
|
1480
|
+
f = np.linspace(0, 10., nout)
|
1481
|
+
|
1482
|
+
# Calculate Lomb-Scargle periodogram
|
1483
|
+
pgram = lombscargle(t, y, f, normalize=True, floating_mean=True)
|
1484
|
+
|
1485
|
+
# exact value will change based on seed
|
1486
|
+
# testing to make sure it is very small
|
1487
|
+
assert(pgram[0] < 1e-4)
|
1488
|
+
|
1489
|
+
def test_simple_div_zero(self):
|
1490
|
+
# these are bare-minimum examples that would, without the eps adjustments,
|
1491
|
+
# cause division-by-zero errors
|
1492
|
+
|
1493
|
+
# first, test with example that will cause first SS sum to be 0.0
|
1494
|
+
t = [t + 1 for t in range(0, 32)]
|
1495
|
+
y = np.ones(len(t))
|
1496
|
+
freqs = [2.0*np.pi] * 2 # must have 2+ elements
|
1497
|
+
lombscargle(t, y, freqs)
|
1498
|
+
|
1499
|
+
# second, test with example that will cause first CC sum to be 0.0
|
1500
|
+
t = [t*4 + 1 for t in range(0, 32)]
|
1501
|
+
y = np.ones(len(t))
|
1502
|
+
freqs = [np.pi/2.0] * 2 # must have 2+ elements
|
1503
|
+
|
1504
|
+
lombscargle(t, y, freqs)
|
1505
|
+
|
1506
|
+
|
1507
|
+
class TestSTFT:
|
1508
|
+
@pytest.mark.thread_unsafe
|
1509
|
+
def test_input_validation(self):
|
1510
|
+
|
1511
|
+
def chk_VE(match):
|
1512
|
+
"""Assert for a ValueError matching regexp `match`.
|
1513
|
+
|
1514
|
+
This little wrapper allows a more concise code layout.
|
1515
|
+
"""
|
1516
|
+
return pytest.raises(ValueError, match=match)
|
1517
|
+
|
1518
|
+
# Checks for check_COLA():
|
1519
|
+
with chk_VE('nperseg must be a positive integer'):
|
1520
|
+
check_COLA('hann', -10, 0)
|
1521
|
+
with chk_VE('noverlap must be less than nperseg.'):
|
1522
|
+
check_COLA('hann', 10, 20)
|
1523
|
+
with chk_VE('window must be 1-D'):
|
1524
|
+
check_COLA(np.ones((2, 2)), 10, 0)
|
1525
|
+
with chk_VE('window must have length of nperseg'):
|
1526
|
+
check_COLA(np.ones(20), 10, 0)
|
1527
|
+
|
1528
|
+
# Checks for check_NOLA():
|
1529
|
+
with chk_VE('nperseg must be a positive integer'):
|
1530
|
+
check_NOLA('hann', -10, 0)
|
1531
|
+
with chk_VE('noverlap must be less than nperseg'):
|
1532
|
+
check_NOLA('hann', 10, 20)
|
1533
|
+
with chk_VE('window must be 1-D'):
|
1534
|
+
check_NOLA(np.ones((2, 2)), 10, 0)
|
1535
|
+
with chk_VE('window must have length of nperseg'):
|
1536
|
+
check_NOLA(np.ones(20), 10, 0)
|
1537
|
+
with chk_VE('noverlap must be a nonnegative integer'):
|
1538
|
+
check_NOLA('hann', 64, -32)
|
1539
|
+
|
1540
|
+
x = np.zeros(1024)
|
1541
|
+
z = stft(x)[2]
|
1542
|
+
|
1543
|
+
# Checks for stft():
|
1544
|
+
with chk_VE('window must be 1-D'):
|
1545
|
+
stft(x, window=np.ones((2, 2)))
|
1546
|
+
with chk_VE('value specified for nperseg is different ' +
|
1547
|
+
'from length of window'):
|
1548
|
+
stft(x, window=np.ones(10), nperseg=256)
|
1549
|
+
with chk_VE('nperseg must be a positive integer'):
|
1550
|
+
stft(x, nperseg=-256)
|
1551
|
+
with chk_VE('noverlap must be less than nperseg.'):
|
1552
|
+
stft(x, nperseg=256, noverlap=1024)
|
1553
|
+
with chk_VE('nfft must be greater than or equal to nperseg.'):
|
1554
|
+
stft(x, nperseg=256, nfft=8)
|
1555
|
+
|
1556
|
+
# Checks for istft():
|
1557
|
+
with chk_VE('Input stft must be at least 2d!'):
|
1558
|
+
istft(x)
|
1559
|
+
with chk_VE('window must be 1-D'):
|
1560
|
+
istft(z, window=np.ones((2, 2)))
|
1561
|
+
with chk_VE('window must have length of 256'):
|
1562
|
+
istft(z, window=np.ones(10), nperseg=256)
|
1563
|
+
with chk_VE('nperseg must be a positive integer'):
|
1564
|
+
istft(z, nperseg=-256)
|
1565
|
+
with chk_VE('noverlap must be less than nperseg.'):
|
1566
|
+
istft(z, nperseg=256, noverlap=1024)
|
1567
|
+
with chk_VE('nfft must be greater than or equal to nperseg.'):
|
1568
|
+
istft(z, nperseg=256, nfft=8)
|
1569
|
+
with pytest.warns(UserWarning, match="NOLA condition failed, " +
|
1570
|
+
"STFT may not be invertible"):
|
1571
|
+
istft(z, nperseg=256, noverlap=0, window='hann')
|
1572
|
+
with chk_VE('Must specify differing time and frequency axes!'):
|
1573
|
+
istft(z, time_axis=0, freq_axis=0)
|
1574
|
+
|
1575
|
+
# Checks for _spectral_helper():
|
1576
|
+
with chk_VE("Unknown value for mode foo, must be one of: " +
|
1577
|
+
r"\{'psd', 'stft'\}"):
|
1578
|
+
_spectral_helper(x, x, mode='foo')
|
1579
|
+
with chk_VE("x and y must be equal if mode is 'stft'"):
|
1580
|
+
_spectral_helper(x[:512], x[512:], mode='stft')
|
1581
|
+
with chk_VE("Unknown boundary option 'foo', must be one of: " +
|
1582
|
+
r"\['even', 'odd', 'constant', 'zeros', None\]"):
|
1583
|
+
_spectral_helper(x, x, boundary='foo')
|
1584
|
+
|
1585
|
+
scaling = "not_valid"
|
1586
|
+
with chk_VE(fr"Parameter {scaling=} not in \['spectrum', 'psd'\]!"):
|
1587
|
+
stft(x, scaling=scaling)
|
1588
|
+
with chk_VE(fr"Parameter {scaling=} not in \['spectrum', 'psd'\]!"):
|
1589
|
+
istft(z, scaling=scaling)
|
1590
|
+
|
1591
|
+
def test_check_COLA(self):
|
1592
|
+
settings = [
|
1593
|
+
('boxcar', 10, 0),
|
1594
|
+
('boxcar', 10, 9),
|
1595
|
+
('bartlett', 51, 26),
|
1596
|
+
('hann', 256, 128),
|
1597
|
+
('hann', 256, 192),
|
1598
|
+
('blackman', 300, 200),
|
1599
|
+
(('tukey', 0.5), 256, 64),
|
1600
|
+
('hann', 256, 255),
|
1601
|
+
]
|
1602
|
+
|
1603
|
+
for setting in settings:
|
1604
|
+
msg = '{}, {}, {}'.format(*setting)
|
1605
|
+
assert_equal(True, check_COLA(*setting), err_msg=msg)
|
1606
|
+
|
1607
|
+
def test_check_NOLA(self):
|
1608
|
+
settings_pass = [
|
1609
|
+
('boxcar', 10, 0),
|
1610
|
+
('boxcar', 10, 9),
|
1611
|
+
('boxcar', 10, 7),
|
1612
|
+
('bartlett', 51, 26),
|
1613
|
+
('bartlett', 51, 10),
|
1614
|
+
('hann', 256, 128),
|
1615
|
+
('hann', 256, 192),
|
1616
|
+
('hann', 256, 37),
|
1617
|
+
('blackman', 300, 200),
|
1618
|
+
('blackman', 300, 123),
|
1619
|
+
(('tukey', 0.5), 256, 64),
|
1620
|
+
(('tukey', 0.5), 256, 38),
|
1621
|
+
('hann', 256, 255),
|
1622
|
+
('hann', 256, 39),
|
1623
|
+
]
|
1624
|
+
for setting in settings_pass:
|
1625
|
+
msg = '{}, {}, {}'.format(*setting)
|
1626
|
+
assert_equal(True, check_NOLA(*setting), err_msg=msg)
|
1627
|
+
|
1628
|
+
w_fail = np.ones(16)
|
1629
|
+
w_fail[::2] = 0
|
1630
|
+
settings_fail = [
|
1631
|
+
(w_fail, len(w_fail), len(w_fail) // 2),
|
1632
|
+
('hann', 64, 0),
|
1633
|
+
]
|
1634
|
+
for setting in settings_fail:
|
1635
|
+
msg = '{}, {}, {}'.format(*setting)
|
1636
|
+
assert_equal(False, check_NOLA(*setting), err_msg=msg)
|
1637
|
+
|
1638
|
+
def test_average_all_segments(self):
|
1639
|
+
rng = np.random.RandomState(1234)
|
1640
|
+
x = rng.randn(1024)
|
1641
|
+
|
1642
|
+
fs = 1.0
|
1643
|
+
window = 'hann'
|
1644
|
+
nperseg = 16
|
1645
|
+
noverlap = 8
|
1646
|
+
|
1647
|
+
# Compare twosided, because onesided welch doubles non-DC terms to
|
1648
|
+
# account for power at negative frequencies. stft doesn't do this,
|
1649
|
+
# because it breaks invertibility.
|
1650
|
+
f, _, Z = stft(x, fs, window, nperseg, noverlap, padded=False,
|
1651
|
+
return_onesided=False, boundary=None)
|
1652
|
+
fw, Pw = welch(x, fs, window, nperseg, noverlap, return_onesided=False,
|
1653
|
+
scaling='spectrum', detrend=False)
|
1654
|
+
|
1655
|
+
assert_allclose(f, fw)
|
1656
|
+
assert_allclose(np.mean(np.abs(Z)**2, axis=-1), Pw)
|
1657
|
+
|
1658
|
+
def test_permute_axes(self):
|
1659
|
+
rng = np.random.RandomState(1234)
|
1660
|
+
x = rng.randn(1024)
|
1661
|
+
|
1662
|
+
fs = 1.0
|
1663
|
+
window = 'hann'
|
1664
|
+
nperseg = 16
|
1665
|
+
noverlap = 8
|
1666
|
+
|
1667
|
+
f1, t1, Z1 = stft(x, fs, window, nperseg, noverlap)
|
1668
|
+
f2, t2, Z2 = stft(x.reshape((-1, 1, 1)), fs, window, nperseg, noverlap,
|
1669
|
+
axis=0)
|
1670
|
+
|
1671
|
+
t3, x1 = istft(Z1, fs, window, nperseg, noverlap)
|
1672
|
+
t4, x2 = istft(Z2.T, fs, window, nperseg, noverlap, time_axis=0,
|
1673
|
+
freq_axis=-1)
|
1674
|
+
|
1675
|
+
assert_allclose(f1, f2)
|
1676
|
+
assert_allclose(t1, t2)
|
1677
|
+
assert_allclose(t3, t4)
|
1678
|
+
assert_allclose(Z1, Z2[:, 0, 0, :])
|
1679
|
+
assert_allclose(x1, x2[:, 0, 0])
|
1680
|
+
|
1681
|
+
@pytest.mark.parametrize('scaling', ['spectrum', 'psd'])
|
1682
|
+
def test_roundtrip_real(self, scaling):
|
1683
|
+
rng = np.random.RandomState(1234)
|
1684
|
+
|
1685
|
+
settings = [
|
1686
|
+
('boxcar', 100, 10, 0), # Test no overlap
|
1687
|
+
('boxcar', 100, 10, 9), # Test high overlap
|
1688
|
+
('bartlett', 101, 51, 26), # Test odd nperseg
|
1689
|
+
('hann', 1024, 256, 128), # Test defaults
|
1690
|
+
(('tukey', 0.5), 1152, 256, 64), # Test Tukey
|
1691
|
+
('hann', 1024, 256, 255), # Test overlapped hann
|
1692
|
+
]
|
1693
|
+
|
1694
|
+
for window, N, nperseg, noverlap in settings:
|
1695
|
+
t = np.arange(N)
|
1696
|
+
x = 10*rng.randn(t.size)
|
1697
|
+
|
1698
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1699
|
+
window=window, detrend=None, padded=False,
|
1700
|
+
scaling=scaling)
|
1701
|
+
|
1702
|
+
tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
|
1703
|
+
window=window, scaling=scaling)
|
1704
|
+
|
1705
|
+
msg = f'{window}, {noverlap}'
|
1706
|
+
assert_allclose(t, tr, err_msg=msg)
|
1707
|
+
assert_allclose(x, xr, err_msg=msg)
|
1708
|
+
|
1709
|
+
@pytest.mark.thread_unsafe
|
1710
|
+
def test_roundtrip_not_nola(self):
|
1711
|
+
rng = np.random.RandomState(1234)
|
1712
|
+
|
1713
|
+
w_fail = np.ones(16)
|
1714
|
+
w_fail[::2] = 0
|
1715
|
+
settings = [
|
1716
|
+
(w_fail, 256, len(w_fail), len(w_fail) // 2),
|
1717
|
+
('hann', 256, 64, 0),
|
1718
|
+
]
|
1719
|
+
|
1720
|
+
for window, N, nperseg, noverlap in settings:
|
1721
|
+
msg = f'{window}, {N}, {nperseg}, {noverlap}'
|
1722
|
+
assert not check_NOLA(window, nperseg, noverlap), msg
|
1723
|
+
|
1724
|
+
t = np.arange(N)
|
1725
|
+
x = 10 * rng.randn(t.size)
|
1726
|
+
|
1727
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1728
|
+
window=window, detrend=None, padded=True,
|
1729
|
+
boundary='zeros')
|
1730
|
+
with pytest.warns(UserWarning, match='NOLA'):
|
1731
|
+
tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
|
1732
|
+
window=window, boundary=True)
|
1733
|
+
|
1734
|
+
assert np.allclose(t, tr[:len(t)]), msg
|
1735
|
+
assert not np.allclose(x, xr[:len(x)]), msg
|
1736
|
+
|
1737
|
+
def test_roundtrip_nola_not_cola(self):
|
1738
|
+
rng = np.random.RandomState(1234)
|
1739
|
+
|
1740
|
+
settings = [
|
1741
|
+
('boxcar', 100, 10, 3), # NOLA True, COLA False
|
1742
|
+
('bartlett', 101, 51, 37), # NOLA True, COLA False
|
1743
|
+
('hann', 1024, 256, 127), # NOLA True, COLA False
|
1744
|
+
(('tukey', 0.5), 1152, 256, 14), # NOLA True, COLA False
|
1745
|
+
('hann', 1024, 256, 5), # NOLA True, COLA False
|
1746
|
+
]
|
1747
|
+
|
1748
|
+
for window, N, nperseg, noverlap in settings:
|
1749
|
+
msg = f'{window}, {nperseg}, {noverlap}'
|
1750
|
+
assert check_NOLA(window, nperseg, noverlap), msg
|
1751
|
+
assert not check_COLA(window, nperseg, noverlap), msg
|
1752
|
+
|
1753
|
+
t = np.arange(N)
|
1754
|
+
x = 10 * rng.randn(t.size)
|
1755
|
+
|
1756
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1757
|
+
window=window, detrend=None, padded=True,
|
1758
|
+
boundary='zeros')
|
1759
|
+
|
1760
|
+
tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
|
1761
|
+
window=window, boundary=True)
|
1762
|
+
|
1763
|
+
msg = f'{window}, {noverlap}'
|
1764
|
+
assert_allclose(t, tr[:len(t)], err_msg=msg)
|
1765
|
+
assert_allclose(x, xr[:len(x)], err_msg=msg)
|
1766
|
+
|
1767
|
+
def test_roundtrip_float32(self):
|
1768
|
+
rng = np.random.RandomState(1234)
|
1769
|
+
|
1770
|
+
settings = [('hann', 1024, 256, 128)]
|
1771
|
+
|
1772
|
+
for window, N, nperseg, noverlap in settings:
|
1773
|
+
t = np.arange(N)
|
1774
|
+
x = 10*rng.randn(t.size)
|
1775
|
+
x = x.astype(np.float32)
|
1776
|
+
|
1777
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1778
|
+
window=window, detrend=None, padded=False)
|
1779
|
+
|
1780
|
+
tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
|
1781
|
+
window=window)
|
1782
|
+
|
1783
|
+
msg = f'{window}, {noverlap}'
|
1784
|
+
assert_allclose(t, t, err_msg=msg)
|
1785
|
+
assert_allclose(x, xr, err_msg=msg, rtol=1e-4, atol=1e-5)
|
1786
|
+
assert_(x.dtype == xr.dtype)
|
1787
|
+
|
1788
|
+
@pytest.mark.thread_unsafe
|
1789
|
+
@pytest.mark.parametrize('scaling', ['spectrum', 'psd'])
|
1790
|
+
def test_roundtrip_complex(self, scaling):
|
1791
|
+
rng = np.random.RandomState(1234)
|
1792
|
+
|
1793
|
+
settings = [
|
1794
|
+
('boxcar', 100, 10, 0), # Test no overlap
|
1795
|
+
('boxcar', 100, 10, 9), # Test high overlap
|
1796
|
+
('bartlett', 101, 51, 26), # Test odd nperseg
|
1797
|
+
('hann', 1024, 256, 128), # Test defaults
|
1798
|
+
(('tukey', 0.5), 1152, 256, 64), # Test Tukey
|
1799
|
+
('hann', 1024, 256, 255), # Test overlapped hann
|
1800
|
+
]
|
1801
|
+
|
1802
|
+
for window, N, nperseg, noverlap in settings:
|
1803
|
+
t = np.arange(N)
|
1804
|
+
x = 10*rng.randn(t.size) + 10j*rng.randn(t.size)
|
1805
|
+
|
1806
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1807
|
+
window=window, detrend=None, padded=False,
|
1808
|
+
return_onesided=False, scaling=scaling)
|
1809
|
+
|
1810
|
+
tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
|
1811
|
+
window=window, input_onesided=False,
|
1812
|
+
scaling=scaling)
|
1813
|
+
|
1814
|
+
msg = f'{window}, {nperseg}, {noverlap}'
|
1815
|
+
assert_allclose(t, tr, err_msg=msg)
|
1816
|
+
assert_allclose(x, xr, err_msg=msg)
|
1817
|
+
|
1818
|
+
# Check that asking for onesided switches to twosided
|
1819
|
+
with suppress_warnings() as sup:
|
1820
|
+
sup.filter(UserWarning,
|
1821
|
+
"Input data is complex, switching to return_onesided=False")
|
1822
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1823
|
+
window=window, detrend=None, padded=False,
|
1824
|
+
return_onesided=True, scaling=scaling)
|
1825
|
+
|
1826
|
+
tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
|
1827
|
+
window=window, input_onesided=False, scaling=scaling)
|
1828
|
+
|
1829
|
+
msg = f'{window}, {nperseg}, {noverlap}'
|
1830
|
+
assert_allclose(t, tr, err_msg=msg)
|
1831
|
+
assert_allclose(x, xr, err_msg=msg)
|
1832
|
+
|
1833
|
+
def test_roundtrip_boundary_extension(self):
|
1834
|
+
rng = np.random.RandomState(1234)
|
1835
|
+
|
1836
|
+
# Test against boxcar, since window is all ones, and thus can be fully
|
1837
|
+
# recovered with no boundary extension
|
1838
|
+
|
1839
|
+
settings = [
|
1840
|
+
('boxcar', 100, 10, 0), # Test no overlap
|
1841
|
+
('boxcar', 100, 10, 9), # Test high overlap
|
1842
|
+
]
|
1843
|
+
|
1844
|
+
for window, N, nperseg, noverlap in settings:
|
1845
|
+
t = np.arange(N)
|
1846
|
+
x = 10*rng.randn(t.size)
|
1847
|
+
|
1848
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1849
|
+
window=window, detrend=None, padded=True,
|
1850
|
+
boundary=None)
|
1851
|
+
|
1852
|
+
_, xr = istft(zz, noverlap=noverlap, window=window, boundary=False)
|
1853
|
+
|
1854
|
+
for boundary in ['even', 'odd', 'constant', 'zeros']:
|
1855
|
+
_, _, zz_ext = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1856
|
+
window=window, detrend=None, padded=True,
|
1857
|
+
boundary=boundary)
|
1858
|
+
|
1859
|
+
_, xr_ext = istft(zz_ext, noverlap=noverlap, window=window,
|
1860
|
+
boundary=True)
|
1861
|
+
|
1862
|
+
msg = f'{window}, {noverlap}, {boundary}'
|
1863
|
+
assert_allclose(x, xr, err_msg=msg)
|
1864
|
+
assert_allclose(x, xr_ext, err_msg=msg)
|
1865
|
+
|
1866
|
+
def test_roundtrip_padded_signal(self):
|
1867
|
+
rng = np.random.RandomState(1234)
|
1868
|
+
|
1869
|
+
settings = [
|
1870
|
+
('boxcar', 101, 10, 0),
|
1871
|
+
('hann', 1000, 256, 128),
|
1872
|
+
]
|
1873
|
+
|
1874
|
+
for window, N, nperseg, noverlap in settings:
|
1875
|
+
t = np.arange(N)
|
1876
|
+
x = 10*rng.randn(t.size)
|
1877
|
+
|
1878
|
+
_, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
|
1879
|
+
window=window, detrend=None, padded=True)
|
1880
|
+
|
1881
|
+
tr, xr = istft(zz, noverlap=noverlap, window=window)
|
1882
|
+
|
1883
|
+
msg = f'{window}, {noverlap}'
|
1884
|
+
# Account for possible zero-padding at the end
|
1885
|
+
assert_allclose(t, tr[:t.size], err_msg=msg)
|
1886
|
+
assert_allclose(x, xr[:x.size], err_msg=msg)
|
1887
|
+
|
1888
|
+
def test_roundtrip_padded_FFT(self):
|
1889
|
+
rng = np.random.RandomState(1234)
|
1890
|
+
|
1891
|
+
settings = [
|
1892
|
+
('hann', 1024, 256, 128, 512),
|
1893
|
+
('hann', 1024, 256, 128, 501),
|
1894
|
+
('boxcar', 100, 10, 0, 33),
|
1895
|
+
(('tukey', 0.5), 1152, 256, 64, 1024),
|
1896
|
+
]
|
1897
|
+
|
1898
|
+
for window, N, nperseg, noverlap, nfft in settings:
|
1899
|
+
t = np.arange(N)
|
1900
|
+
x = 10*rng.randn(t.size)
|
1901
|
+
xc = x*np.exp(1j*np.pi/4)
|
1902
|
+
|
1903
|
+
# real signal
|
1904
|
+
_, _, z = stft(x, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
|
1905
|
+
window=window, detrend=None, padded=True)
|
1906
|
+
|
1907
|
+
# complex signal
|
1908
|
+
_, _, zc = stft(xc, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
|
1909
|
+
window=window, detrend=None, padded=True,
|
1910
|
+
return_onesided=False)
|
1911
|
+
|
1912
|
+
tr, xr = istft(z, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
|
1913
|
+
window=window)
|
1914
|
+
|
1915
|
+
tr, xcr = istft(zc, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
|
1916
|
+
window=window, input_onesided=False)
|
1917
|
+
|
1918
|
+
msg = f'{window}, {noverlap}'
|
1919
|
+
assert_allclose(t, tr, err_msg=msg)
|
1920
|
+
assert_allclose(x, xr, err_msg=msg)
|
1921
|
+
assert_allclose(xc, xcr, err_msg=msg)
|
1922
|
+
|
1923
|
+
def test_axis_rolling(self):
|
1924
|
+
rng = np.random.RandomState(1234)
|
1925
|
+
|
1926
|
+
x_flat = rng.randn(1024)
|
1927
|
+
_, _, z_flat = stft(x_flat)
|
1928
|
+
|
1929
|
+
for a in range(3):
|
1930
|
+
newshape = [1,]*3
|
1931
|
+
newshape[a] = -1
|
1932
|
+
x = x_flat.reshape(newshape)
|
1933
|
+
|
1934
|
+
_, _, z_plus = stft(x, axis=a) # Positive axis index
|
1935
|
+
_, _, z_minus = stft(x, axis=a-x.ndim) # Negative axis index
|
1936
|
+
|
1937
|
+
assert_equal(z_flat, z_plus.squeeze(), err_msg=a)
|
1938
|
+
assert_equal(z_flat, z_minus.squeeze(), err_msg=a-x.ndim)
|
1939
|
+
|
1940
|
+
# z_flat has shape [n_freq, n_time]
|
1941
|
+
|
1942
|
+
# Test vs. transpose
|
1943
|
+
_, x_transpose_m = istft(z_flat.T, time_axis=-2, freq_axis=-1)
|
1944
|
+
_, x_transpose_p = istft(z_flat.T, time_axis=0, freq_axis=1)
|
1945
|
+
|
1946
|
+
assert_allclose(x_flat, x_transpose_m, err_msg='istft transpose minus')
|
1947
|
+
assert_allclose(x_flat, x_transpose_p, err_msg='istft transpose plus')
|
1948
|
+
|
1949
|
+
def test_roundtrip_scaling(self):
|
1950
|
+
"""Verify behavior of scaling parameter. """
|
1951
|
+
# Create 1024 sample cosine signal with amplitude 2:
|
1952
|
+
X = np.zeros(513, dtype=complex)
|
1953
|
+
X[256] = 1024
|
1954
|
+
x = np.fft.irfft(X)
|
1955
|
+
power_x = sum(x**2) / len(x) # power of signal x is 2
|
1956
|
+
|
1957
|
+
# Calculate magnitude-scaled STFT:
|
1958
|
+
Zs = stft(x, boundary='even', scaling='spectrum')[2]
|
1959
|
+
|
1960
|
+
# Test round trip:
|
1961
|
+
x1 = istft(Zs, boundary=True, scaling='spectrum')[1]
|
1962
|
+
assert_allclose(x1, x)
|
1963
|
+
|
1964
|
+
# For a Hann-windowed 256 sample length FFT, we expect a peak at
|
1965
|
+
# frequency 64 (since it is 1/4 the length of X) with a height of 1
|
1966
|
+
# (half the amplitude). A Hann window of a perfectly centered sine has
|
1967
|
+
# the magnitude [..., 0, 0, 0.5, 1, 0.5, 0, 0, ...].
|
1968
|
+
# Note that in this case the 'even' padding works for the beginning
|
1969
|
+
# but not for the end of the STFT.
|
1970
|
+
assert_allclose(abs(Zs[63, :-1]), 0.5)
|
1971
|
+
assert_allclose(abs(Zs[64, :-1]), 1)
|
1972
|
+
assert_allclose(abs(Zs[65, :-1]), 0.5)
|
1973
|
+
# All other values should be zero:
|
1974
|
+
Zs[63:66, :-1] = 0
|
1975
|
+
# Note since 'rtol' does not have influence here, atol needs to be set:
|
1976
|
+
assert_allclose(Zs[:, :-1], 0, atol=np.finfo(Zs.dtype).resolution)
|
1977
|
+
|
1978
|
+
# Calculate two-sided psd-scaled STFT:
|
1979
|
+
# - using 'even' padding since signal is axis symmetric - this ensures
|
1980
|
+
# stationary behavior on the boundaries
|
1981
|
+
# - using the two-sided transform allows determining the spectral
|
1982
|
+
# power by `sum(abs(Zp[:, k])**2) / len(f)` for the k-th time slot.
|
1983
|
+
Zp = stft(x, return_onesided=False, boundary='even', scaling='psd')[2]
|
1984
|
+
|
1985
|
+
# Calculate spectral power of Zd by summing over the frequency axis:
|
1986
|
+
psd_Zp = np.sum(Zp.real**2 + Zp.imag**2, axis=0) / Zp.shape[0]
|
1987
|
+
# Spectral power of Zp should be equal to the signal's power:
|
1988
|
+
assert_allclose(psd_Zp, power_x)
|
1989
|
+
|
1990
|
+
# Test round trip:
|
1991
|
+
x1 = istft(Zp, input_onesided=False, boundary=True, scaling='psd')[1]
|
1992
|
+
assert_allclose(x1, x)
|
1993
|
+
|
1994
|
+
# The power of the one-sided psd-scaled STFT can be determined
|
1995
|
+
# analogously (note that the two sides are not of equal shape):
|
1996
|
+
Zp0 = stft(x, return_onesided=True, boundary='even', scaling='psd')[2]
|
1997
|
+
|
1998
|
+
# Since x is real, its Fourier transform is conjugate symmetric, i.e.,
|
1999
|
+
# the missing 'second side' can be expressed through the 'first side':
|
2000
|
+
Zp1 = np.conj(Zp0[-2:0:-1, :]) # 'second side' is conjugate reversed
|
2001
|
+
assert_allclose(Zp[:129, :], Zp0)
|
2002
|
+
assert_allclose(Zp[129:, :], Zp1)
|
2003
|
+
|
2004
|
+
# Calculate the spectral power:
|
2005
|
+
s2 = (np.sum(Zp0.real ** 2 + Zp0.imag ** 2, axis=0) +
|
2006
|
+
np.sum(Zp1.real ** 2 + Zp1.imag ** 2, axis=0))
|
2007
|
+
psd_Zp01 = s2 / (Zp0.shape[0] + Zp1.shape[0])
|
2008
|
+
assert_allclose(psd_Zp01, power_x)
|
2009
|
+
|
2010
|
+
# Test round trip:
|
2011
|
+
x1 = istft(Zp0, input_onesided=True, boundary=True, scaling='psd')[1]
|
2012
|
+
assert_allclose(x1, x)
|
2013
|
+
|
2014
|
+
|
2015
|
+
class TestSampledSpectralRepresentations:
|
2016
|
+
"""Check energy/power relations from `Spectral Analysis` section in the user guide.
|
2017
|
+
|
2018
|
+
A 32 sample cosine signal is used to compare the numerical to the expected results
|
2019
|
+
stated in :ref:`tutorial_SpectralAnalysis` in
|
2020
|
+
file ``doc/source/tutorial/signal.rst``
|
2021
|
+
"""
|
2022
|
+
n: int = 32 #: number of samples
|
2023
|
+
T: float = 1/16 #: sampling interval
|
2024
|
+
a_ref: float = 3 #: amplitude of reference
|
2025
|
+
l_a: int = 3 #: index in fft for defining frequency of test signal
|
2026
|
+
|
2027
|
+
x_ref: np.ndarray #: reference signal
|
2028
|
+
X_ref: np.ndarray #: two-sided FFT of x_ref
|
2029
|
+
E_ref: float #: energy of signal
|
2030
|
+
P_ref: float #: power of signal
|
2031
|
+
|
2032
|
+
def setup_method(self):
|
2033
|
+
"""Create Cosine signal with amplitude a from spectrum. """
|
2034
|
+
f = rfftfreq(self.n, self.T)
|
2035
|
+
X_ref = np.zeros_like(f)
|
2036
|
+
self.l_a = 3
|
2037
|
+
X_ref[self.l_a] = self.a_ref/2 * self.n # set amplitude
|
2038
|
+
self.x_ref = irfft(X_ref)
|
2039
|
+
self.X_ref = fft(self.x_ref)
|
2040
|
+
|
2041
|
+
# Closed form expression for continuous-time signal:
|
2042
|
+
self.E_ref = self.tau * self.a_ref**2 / 2 # energy of signal
|
2043
|
+
self.P_ref = self.a_ref**2 / 2 # power of signal
|
2044
|
+
|
2045
|
+
@property
|
2046
|
+
def tau(self) -> float:
|
2047
|
+
"""Duration of signal. """
|
2048
|
+
return self.n * self.T
|
2049
|
+
|
2050
|
+
@property
|
2051
|
+
def delta_f(self) -> float:
|
2052
|
+
"""Bin width """
|
2053
|
+
return 1 / (self.n * self.T)
|
2054
|
+
|
2055
|
+
def test_reference_signal(self):
|
2056
|
+
"""Test energy and power formulas. """
|
2057
|
+
# Verify that amplitude is a:
|
2058
|
+
assert_allclose(2*self.a_ref, np.ptp(self.x_ref), rtol=0.1)
|
2059
|
+
# Verify that energy expression for sampled signal:
|
2060
|
+
assert_allclose(self.T * sum(self.x_ref ** 2), self.E_ref)
|
2061
|
+
|
2062
|
+
# Verify that spectral energy and power formulas are correct:
|
2063
|
+
sum_X_ref_squared = sum(self.X_ref.real**2 + self.X_ref.imag**2)
|
2064
|
+
assert_allclose(self.T/self.n * sum_X_ref_squared, self.E_ref)
|
2065
|
+
assert_allclose(1/self.n**2 * sum_X_ref_squared, self.P_ref)
|
2066
|
+
|
2067
|
+
def test_windowed_DFT(self):
|
2068
|
+
"""Verify spectral representations of windowed DFT.
|
2069
|
+
|
2070
|
+
Furthermore, the scalings of `periodogram` and `welch` are verified.
|
2071
|
+
"""
|
2072
|
+
w = hann(self.n, sym=False)
|
2073
|
+
c_amp, c_rms = abs(sum(w)), np.sqrt(sum(w.real**2 + w.imag**2))
|
2074
|
+
Xw = fft(self.x_ref*w) # unnormalized windowed DFT
|
2075
|
+
|
2076
|
+
# Verify that the *spectrum* peak is consistent:
|
2077
|
+
assert_allclose(self.tau * Xw[self.l_a] / c_amp, self.a_ref * self.tau / 2)
|
2078
|
+
# Verify that the *amplitude spectrum* peak is consistent:
|
2079
|
+
assert_allclose(Xw[self.l_a] / c_amp, self.a_ref/2)
|
2080
|
+
|
2081
|
+
# Verify spectral power/energy equals signal's power/energy:
|
2082
|
+
X_ESD = self.tau * self.T * abs(Xw / c_rms)**2 # Energy Spectral Density
|
2083
|
+
X_PSD = self.T * abs(Xw / c_rms)**2 # Power Spectral Density
|
2084
|
+
assert_allclose(self.delta_f * sum(X_ESD), self.E_ref)
|
2085
|
+
assert_allclose(self.delta_f * sum(X_PSD), self.P_ref)
|
2086
|
+
|
2087
|
+
# Verify scalings of periodogram:
|
2088
|
+
kw = dict(fs=1/self.T, window=w, detrend=False, return_onesided=False)
|
2089
|
+
_, P_mag = periodogram(self.x_ref, scaling='spectrum', **kw)
|
2090
|
+
_, P_psd = periodogram(self.x_ref, scaling='density', **kw)
|
2091
|
+
|
2092
|
+
# Verify that periodogram calculates a squared magnitude spectrum:
|
2093
|
+
float_res = np.finfo(P_mag.dtype).resolution
|
2094
|
+
assert_allclose(P_mag, abs(Xw/c_amp)**2, atol=float_res*max(P_mag))
|
2095
|
+
# Verify that periodogram calculates a PSD:
|
2096
|
+
assert_allclose(P_psd, X_PSD, atol=float_res*max(P_psd))
|
2097
|
+
|
2098
|
+
# Ensure that scaling of welch is the same as of periodogram:
|
2099
|
+
kw = dict(nperseg=len(self.x_ref), noverlap=0, **kw)
|
2100
|
+
assert_allclose(welch(self.x_ref, scaling='spectrum', **kw)[1], P_mag,
|
2101
|
+
atol=float_res*max(P_mag))
|
2102
|
+
assert_allclose(welch(self.x_ref, scaling='density', **kw)[1], P_psd,
|
2103
|
+
atol=float_res*max(P_psd))
|