scipy 1.16.2__cp314-cp314-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp314-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp314-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp314-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp314-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp314-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp314-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp314-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp314-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp314-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp314-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp314-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp314-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp314-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp314-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp314-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp314-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp314-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp314-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp314-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp314-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp314-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp314-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp314-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp314-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp314-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp314-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp314-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp314-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp314-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp314-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp314-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp314-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp314-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp314-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp314-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp314-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp314-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp314-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp314-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp314-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp314-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp314-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp314-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp314-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp314-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp314-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp314-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp314-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp314-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp314-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp314-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp314-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp314-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp314-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp314-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp314-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp314-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp314-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp314-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp314-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp314-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp314-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp314-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp314-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp314-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp314-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp314-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp314-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp314-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp314-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp314-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp314-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp314-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp314-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp314-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp314-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp314-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp314-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp314-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp314-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp314-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp314-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp314-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp314-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp314-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp314-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp314-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp314-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp314-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp314-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp314-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp314-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp314-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp314-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp314-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp314-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp314-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp314-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp314-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp314-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp314-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp314-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp314-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp314-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp314-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp314-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp314-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp314-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp314-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp314-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp314-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp314-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp314-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp314-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp314-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp314-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp314-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp314-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp314-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp314-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp314-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp314-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp314-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp314-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp314-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp314-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp314-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp314-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp314-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp314-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp314-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp314-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp314-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp314-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp314-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp314-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp314-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp314-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp314-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp314-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp314-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp314-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp314-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp314-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp314-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp314-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp314-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp314-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp314-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp314-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp314-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp314-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp314-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp314-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp314-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp314-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp314-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp314-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp314-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp314-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp314-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp314-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp314-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp314-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp314-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp314-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp314-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp314-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp314-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp314-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp314-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp314-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp314-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp314-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp314-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp314-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp314-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp314-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp314-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp314-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp314-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp314-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp314-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp314-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp314-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp314-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp314-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp314-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp314-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp314-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp314-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp314-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp314-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp314-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp314-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp314-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp314-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp314-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp314-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp314-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp314-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp314-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp314-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp314-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,2141 @@
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
+ def test_amplitude(self):
1059
+ # Test if height of peak in unnormalized Lomb-Scargle periodogram
1060
+ # corresponds to amplitude of the generated input signal.
1061
+
1062
+ # Input parameters
1063
+ ampl = 2.
1064
+ w = 1.
1065
+ phi = 0.5 * np.pi
1066
+ nin = 1000
1067
+ nout = 1000
1068
+ p = 0.7 # Fraction of points to select
1069
+
1070
+ # Randomly select a fraction of an array with timesteps
1071
+ rng = np.random.RandomState(2353425)
1072
+ r = rng.rand(nin)
1073
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1074
+
1075
+ # Plot a sine wave for the selected times
1076
+ y = ampl * np.sin(w*t + phi)
1077
+
1078
+ # Define the array of frequencies for which to compute the periodogram
1079
+ f = np.linspace(0.01, 10., nout)
1080
+
1081
+ # Calculate Lomb-Scargle periodogram
1082
+ pgram = lombscargle(t, y, f)
1083
+
1084
+ # convert to the amplitude
1085
+ pgram = np.sqrt(4.0 * pgram / t.shape[0])
1086
+
1087
+ # Check if amplitude is correct (this will not exactly match, due to
1088
+ # numerical differences when data is removed)
1089
+ assert_allclose(pgram[f==w], ampl, rtol=5e-2)
1090
+
1091
+ def test_precenter(self):
1092
+ # Test if precenter gives the same result as manually precentering
1093
+ # (for a very simple offset)
1094
+
1095
+ # Input parameters
1096
+ ampl = 2.
1097
+ w = 1.
1098
+ phi = 0.5 * np.pi
1099
+ nin = 100
1100
+ nout = 1000
1101
+ p = 0.7 # Fraction of points to select
1102
+ offset = 0.15 # Offset to be subtracted in pre-centering
1103
+
1104
+ # Randomly select a fraction of an array with timesteps
1105
+ rng = np.random.RandomState(2353425)
1106
+ r = rng.rand(nin)
1107
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1108
+
1109
+ # Plot a sine wave for the selected times
1110
+ y = ampl * np.sin(w*t + phi) + offset
1111
+
1112
+ # Define the array of frequencies for which to compute the periodogram
1113
+ f = np.linspace(0.01, 10., nout)
1114
+
1115
+ # Calculate Lomb-Scargle periodogram
1116
+ pgram = lombscargle(t, y, f, precenter=True)
1117
+ pgram2 = lombscargle(t, y - y.mean(), f, precenter=False)
1118
+
1119
+ # check if centering worked
1120
+ assert_allclose(pgram, pgram2)
1121
+
1122
+ # do this again, but with floating_mean=True
1123
+
1124
+ # Calculate Lomb-Scargle periodogram
1125
+ pgram = lombscargle(t, y, f, precenter=True, floating_mean=True)
1126
+ pgram2 = lombscargle(t, y - y.mean(), f, precenter=False, floating_mean=True)
1127
+
1128
+ # check if centering worked
1129
+ assert_allclose(pgram, pgram2)
1130
+
1131
+ def test_normalize(self):
1132
+ # Test normalize option of Lomb-Scarge.
1133
+
1134
+ # Input parameters
1135
+ ampl = 2.
1136
+ w = 1.
1137
+ phi = 0.5 * np.pi
1138
+ nin = 100
1139
+ nout = 1000
1140
+ p = 0.7 # Fraction of points to select
1141
+
1142
+ # Randomly select a fraction of an array with timesteps
1143
+ rng = np.random.RandomState(2353425)
1144
+ r = rng.rand(nin)
1145
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1146
+
1147
+ # Plot a sine wave for the selected times
1148
+ y = ampl * np.sin(w*t + phi)
1149
+
1150
+ # Define the array of frequencies for which to compute the periodogram
1151
+ f = np.linspace(0.01, 10., nout)
1152
+
1153
+ # Calculate Lomb-Scargle periodogram
1154
+ pgram = lombscargle(t, y, f)
1155
+ pgram2 = lombscargle(t, y, f, normalize=True)
1156
+
1157
+ # Calculate the scale to convert from unnormalized to normalized
1158
+ weights = np.ones_like(t)/float(t.shape[0])
1159
+ YY_hat = (weights * y * y).sum()
1160
+ YY = YY_hat # correct formula for floating_mean=False
1161
+ scale_to_use = 2/(YY*t.shape[0])
1162
+
1163
+ # check if normalization works as expected
1164
+ assert_allclose(pgram * scale_to_use, pgram2)
1165
+ assert_allclose(np.max(pgram2), 1.0)
1166
+
1167
+ def test_wrong_shape(self):
1168
+
1169
+ # different length t and y
1170
+ t = np.linspace(0, 1, 1)
1171
+ y = np.linspace(0, 1, 2)
1172
+ f = np.linspace(0, 1, 3) + 0.1
1173
+ assert_raises(ValueError, lombscargle, t, y, f)
1174
+
1175
+ # t is 2D, with both axes length > 1
1176
+ t = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
1177
+ y = np.linspace(0, 1, 2)
1178
+ f = np.linspace(0, 1, 3) + 0.1
1179
+ assert_raises(ValueError, lombscargle, t, y, f)
1180
+
1181
+ # y is 2D, with both axes length > 1
1182
+ t = np.linspace(0, 1, 2)
1183
+ y = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
1184
+ f = np.linspace(0, 1, 3) + 0.1
1185
+ assert_raises(ValueError, lombscargle, t, y, f)
1186
+
1187
+ # f is 2D, with both axes length > 1
1188
+ t = np.linspace(0, 1, 2)
1189
+ y = np.linspace(0, 1, 2)
1190
+ f = np.repeat(np.expand_dims(np.linspace(0, 1, 3), 1) + 0.1, 2, axis=1)
1191
+ assert_raises(ValueError, lombscargle, t, y, f)
1192
+
1193
+ # weights is 2D, with both axes length > 1
1194
+ t = np.linspace(0, 1, 2)
1195
+ y = np.linspace(0, 1, 2)
1196
+ f = np.linspace(0, 1, 3) + 0.1
1197
+ weights = np.repeat(np.expand_dims(np.linspace(0, 1, 2), 1), 2, axis=1)
1198
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1199
+
1200
+ def test_lombscargle_atan_vs_atan2(self):
1201
+ # https://github.com/scipy/scipy/issues/3787
1202
+ # This raised a ZeroDivisionError.
1203
+ t = np.linspace(0, 10, 1000, endpoint=False)
1204
+ y = np.sin(4*t)
1205
+ f = np.linspace(0, 50, 500, endpoint=False) + 0.1
1206
+ lombscargle(t, y, f*2*np.pi)
1207
+
1208
+ def test_wrong_shape_weights(self):
1209
+ # Weights must be the same shape as t
1210
+
1211
+ t = np.linspace(0, 1, 1)
1212
+ y = np.linspace(0, 1, 1)
1213
+ f = np.linspace(0, 1, 3) + 0.1
1214
+ weights = np.linspace(1, 2, 2)
1215
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1216
+
1217
+ def test_zero_division_weights(self):
1218
+ # Weights cannot sum to 0
1219
+
1220
+ t = np.zeros(1)
1221
+ y = np.zeros(1)
1222
+ f = np.ones(1)
1223
+ weights = np.zeros(1)
1224
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1225
+
1226
+ def test_normalize_parameter(self):
1227
+ # Test the validity of the normalize parameter input
1228
+
1229
+ # Input parameters
1230
+ ampl = 2.
1231
+ w = 1.
1232
+ phi = 0
1233
+ nin = 100
1234
+ nout = 1000
1235
+ p = 0.7 # Fraction of points to select
1236
+
1237
+ # Randomly select a fraction of an array with timesteps
1238
+ rng = np.random.RandomState(2353425)
1239
+ r = rng.rand(nin)
1240
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1241
+
1242
+ # Plot a sine wave for the selected times
1243
+ y = ampl * np.sin(w*t + phi)
1244
+
1245
+ # Define the array of frequencies for which to compute the periodogram
1246
+ f = np.linspace(0.01, 10., nout)
1247
+
1248
+ # check each of the valid inputs
1249
+ pgram_false = lombscargle(t, y, f, normalize=False)
1250
+ pgram_true = lombscargle(t, y, f, normalize=True)
1251
+ pgram_power = lombscargle(t, y, f, normalize='power')
1252
+ pgram_norm = lombscargle(t, y, f, normalize='normalize')
1253
+ pgram_amp = lombscargle(t, y, f, normalize='amplitude')
1254
+
1255
+ # validate the results that should be the same
1256
+ assert_allclose(pgram_false, pgram_power)
1257
+ assert_allclose(pgram_true, pgram_norm)
1258
+
1259
+ # validate that the power and norm outputs are proper wrt each other
1260
+ weights = np.ones_like(y)/float(y.shape[0])
1261
+ YY_hat = (weights * y * y).sum()
1262
+ YY = YY_hat # correct formula for floating_mean=False
1263
+ assert_allclose(pgram_power * 2.0 / (float(t.shape[0]) * YY), pgram_norm)
1264
+
1265
+ # validate that the amp output is correct for the given input
1266
+ f_i = np.where(f==w)[0][0]
1267
+ assert_allclose(np.abs(pgram_amp[f_i]), ampl)
1268
+
1269
+ # check invalid inputs
1270
+ # 1) a string that is not allowed
1271
+ assert_raises(ValueError, lombscargle, t, y, f, normalize='lomb')
1272
+ # 2) something besides a bool or str
1273
+ assert_raises(ValueError, lombscargle, t, y, f, normalize=2)
1274
+
1275
+ def test_offset_removal(self):
1276
+ # Verify that the amplitude is the same, even with an offset
1277
+ # must use floating_mean=True, otherwise it will not remove an offset
1278
+
1279
+ # Input parameters
1280
+ ampl = 2.
1281
+ w = 1.
1282
+ phi = 0.5 * np.pi
1283
+ nin = 100
1284
+ nout = 1000
1285
+ p = 0.7 # Fraction of points to select
1286
+ offset = 2.15 # Large offset
1287
+
1288
+ # Randomly select a fraction of an array with timesteps
1289
+ rng = np.random.RandomState(2353425)
1290
+ r = rng.rand(nin)
1291
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1292
+
1293
+ # Plot a sine wave for the selected times
1294
+ y = ampl * np.sin(w*t + phi)
1295
+
1296
+ # Define the array of frequencies for which to compute the periodogram
1297
+ f = np.linspace(0.01, 10., nout)
1298
+
1299
+ # Calculate Lomb-Scargle periodogram
1300
+ pgram = lombscargle(t, y, f, floating_mean=True)
1301
+ pgram_offset = lombscargle(t, y + offset, f, floating_mean=True)
1302
+
1303
+ # check if offset removal works as expected
1304
+ assert_allclose(pgram, pgram_offset)
1305
+
1306
+ def test_floating_mean_false(self):
1307
+ # Verify that when disabling the floating_mean, the calculations are correct
1308
+
1309
+ # Input parameters
1310
+ ampl = 2.
1311
+ w = 1.
1312
+ phi = 0
1313
+ nin = 1000
1314
+ nout = 1000
1315
+ p = 0.7 # Fraction of points to select
1316
+ offset = 2 # Large offset
1317
+
1318
+ # Randomly select a fraction of an array with timesteps
1319
+ rng = np.random.RandomState(2353425)
1320
+ r = rng.rand(nin)
1321
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1322
+
1323
+ # Plot a cos wave for the selected times
1324
+ y = ampl * np.cos(w*t + phi)
1325
+
1326
+ # Define the array of frequencies for which to compute the periodogram
1327
+ f = np.linspace(0.01, 10., nout)
1328
+
1329
+ # Calculate Lomb-Scargle periodogram
1330
+ pgram = lombscargle(t, y, f, normalize=True, floating_mean=False)
1331
+ pgram_offset = lombscargle(t, y + offset, f, normalize=True,
1332
+ floating_mean=False)
1333
+
1334
+ # check if disabling floating_mean works as expected
1335
+ # nearly-zero for no offset, exact value will change based on seed
1336
+ assert(pgram[0] < 0.01)
1337
+ # significant value with offset, exact value will change based on seed
1338
+ assert(pgram_offset[0] > 0.5)
1339
+
1340
+ def test_amplitude_is_correct(self):
1341
+ # Verify that the amplitude is correct (when normalize='amplitude')
1342
+
1343
+ # Input parameters
1344
+ ampl = 2.
1345
+ w = 1.
1346
+ phi = 0.12
1347
+ nin = 100
1348
+ nout = 1000
1349
+ p = 0.7 # Fraction of points to select
1350
+ offset = 2.15 # Large offset
1351
+
1352
+ # Randomly select a fraction of an array with timesteps
1353
+ rng = np.random.RandomState(2353425)
1354
+ r = rng.rand(nin)
1355
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1356
+
1357
+ # Plot a sine wave for the selected times
1358
+ y = ampl * np.cos(w*t + phi) + offset
1359
+
1360
+ # Define the array of frequencies for which to compute the periodogram
1361
+ f = np.linspace(0.01, 10., nout)
1362
+
1363
+ # Get the index of where the exact result should be
1364
+ f_indx = np.where(f==w)[0][0]
1365
+
1366
+ # Calculate Lomb-Scargle periodogram (amplitude + phase)
1367
+ pgram = lombscargle(t, y, f, normalize='amplitude', floating_mean=True)
1368
+
1369
+ # Check if amplitude is correct
1370
+ assert_allclose(np.abs(pgram[f_indx]), ampl)
1371
+
1372
+ # Check if phase is correct
1373
+ # (phase angle is the negative of the phase offset)
1374
+ assert_allclose(-np.angle(pgram[f_indx]), phi)
1375
+
1376
+ def test_negative_weight(self):
1377
+ # Test that a negative weight produces an error
1378
+
1379
+ t = np.zeros(1)
1380
+ y = np.zeros(1)
1381
+ f = np.ones(1)
1382
+ weights = -np.ones(1)
1383
+ assert_raises(ValueError, lombscargle, t, y, f, weights=weights)
1384
+
1385
+ def test_list_input(self):
1386
+ # Test that input can be passsed in as lists and with a numerical issue
1387
+ # https://github.com/scipy/scipy/issues/8787
1388
+
1389
+ t = [1.98201652e+09, 1.98201752e+09, 1.98201852e+09, 1.98201952e+09,
1390
+ 1.98202052e+09, 1.98202152e+09, 1.98202252e+09, 1.98202352e+09,
1391
+ 1.98202452e+09, 1.98202552e+09, 1.98202652e+09, 1.98202752e+09,
1392
+ 1.98202852e+09, 1.98202952e+09, 1.98203052e+09, 1.98203152e+09,
1393
+ 1.98203252e+09, 1.98203352e+09, 1.98203452e+09, 1.98203552e+09,
1394
+ 1.98205452e+09, 1.98205552e+09, 1.98205652e+09, 1.98205752e+09,
1395
+ 1.98205852e+09, 1.98205952e+09, 1.98206052e+09, 1.98206152e+09,
1396
+ 1.98206252e+09, 1.98206352e+09, 1.98206452e+09, 1.98206552e+09,
1397
+ 1.98206652e+09, 1.98206752e+09, 1.98206852e+09, 1.98206952e+09,
1398
+ 1.98207052e+09, 1.98207152e+09, 1.98207252e+09, 1.98207352e+09,
1399
+ 1.98209652e+09, 1.98209752e+09, 1.98209852e+09, 1.98209952e+09,
1400
+ 1.98210052e+09, 1.98210152e+09, 1.98210252e+09, 1.98210352e+09,
1401
+ 1.98210452e+09, 1.98210552e+09, 1.98210652e+09, 1.98210752e+09,
1402
+ 1.98210852e+09, 1.98210952e+09, 1.98211052e+09, 1.98211152e+09,
1403
+ 1.98211252e+09, 1.98211352e+09, 1.98211452e+09, 1.98211552e+09,
1404
+ 1.98217252e+09, 1.98217352e+09, 1.98217452e+09, 1.98217552e+09,
1405
+ 1.98217652e+09, 1.98217752e+09, 1.98217852e+09, 1.98217952e+09,
1406
+ 1.98218052e+09, 1.98218152e+09, 1.98218252e+09, 1.98218352e+09,
1407
+ 1.98218452e+09, 1.98218552e+09, 1.98218652e+09, 1.98218752e+09,
1408
+ 1.98218852e+09, 1.98218952e+09, 1.98219052e+09, 1.98219152e+09,
1409
+ 1.98219352e+09, 1.98219452e+09, 1.98219552e+09, 1.98219652e+09,
1410
+ 1.98219752e+09, 1.98219852e+09, 1.98219952e+09, 1.98220052e+09,
1411
+ 1.98220152e+09, 1.98220252e+09, 1.98220352e+09, 1.98220452e+09,
1412
+ 1.98220552e+09, 1.98220652e+09, 1.98220752e+09, 1.98220852e+09,
1413
+ 1.98220952e+09, 1.98221052e+09, 1.98221152e+09, 1.98221252e+09,
1414
+ 1.98222752e+09, 1.98222852e+09, 1.98222952e+09, 1.98223052e+09,
1415
+ 1.98223152e+09, 1.98223252e+09, 1.98223352e+09, 1.98223452e+09,
1416
+ 1.98223552e+09, 1.98223652e+09, 1.98223752e+09, 1.98223852e+09,
1417
+ 1.98223952e+09, 1.98224052e+09, 1.98224152e+09, 1.98224252e+09,
1418
+ 1.98224352e+09, 1.98224452e+09, 1.98224552e+09, 1.98224652e+09,
1419
+ 1.98224752e+09]
1420
+ y = [2.97600000e+03, 3.18200000e+03, 3.74900000e+03, 4.53500000e+03,
1421
+ 5.43300000e+03, 6.38000000e+03, 7.34000000e+03, 8.29200000e+03,
1422
+ 9.21900000e+03, 1.01120000e+04, 1.09620000e+04, 1.17600000e+04,
1423
+ 1.25010000e+04, 1.31790000e+04, 1.37900000e+04, 1.43290000e+04,
1424
+ 1.47940000e+04, 1.51800000e+04, 1.54870000e+04, 1.57110000e+04,
1425
+ 5.74200000e+03, 4.82300000e+03, 3.99100000e+03, 3.33600000e+03,
1426
+ 2.99600000e+03, 3.08400000e+03, 3.56700000e+03, 4.30700000e+03,
1427
+ 5.18200000e+03, 6.11900000e+03, 7.07900000e+03, 8.03400000e+03,
1428
+ 8.97000000e+03, 9.87300000e+03, 1.07350000e+04, 1.15480000e+04,
1429
+ 1.23050000e+04, 1.30010000e+04, 1.36300000e+04, 1.41890000e+04,
1430
+ 6.00000000e+03, 5.06800000e+03, 4.20500000e+03, 3.49000000e+03,
1431
+ 3.04900000e+03, 3.01600000e+03, 3.40400000e+03, 4.08800000e+03,
1432
+ 4.93500000e+03, 5.86000000e+03, 6.81700000e+03, 7.77500000e+03,
1433
+ 8.71800000e+03, 9.63100000e+03, 1.05050000e+04, 1.13320000e+04,
1434
+ 1.21050000e+04, 1.28170000e+04, 1.34660000e+04, 1.40440000e+04,
1435
+ 1.32730000e+04, 1.26040000e+04, 1.18720000e+04, 1.10820000e+04,
1436
+ 1.02400000e+04, 9.35300000e+03, 8.43000000e+03, 7.48100000e+03,
1437
+ 6.52100000e+03, 5.57000000e+03, 4.66200000e+03, 3.85400000e+03,
1438
+ 3.24600000e+03, 2.97900000e+03, 3.14700000e+03, 3.68800000e+03,
1439
+ 4.45900000e+03, 5.35000000e+03, 6.29400000e+03, 7.25400000e+03,
1440
+ 9.13800000e+03, 1.00340000e+04, 1.08880000e+04, 1.16910000e+04,
1441
+ 1.24370000e+04, 1.31210000e+04, 1.37380000e+04, 1.42840000e+04,
1442
+ 1.47550000e+04, 1.51490000e+04, 1.54630000e+04, 1.56950000e+04,
1443
+ 1.58430000e+04, 1.59070000e+04, 1.58860000e+04, 1.57800000e+04,
1444
+ 1.55910000e+04, 1.53190000e+04, 1.49650000e+04, 1.45330000e+04,
1445
+ 3.01000000e+03, 3.05900000e+03, 3.51200000e+03, 4.23400000e+03,
1446
+ 5.10000000e+03, 6.03400000e+03, 6.99300000e+03, 7.95000000e+03,
1447
+ 8.88800000e+03, 9.79400000e+03, 1.06600000e+04, 1.14770000e+04,
1448
+ 1.22400000e+04, 1.29410000e+04, 1.35770000e+04, 1.41430000e+04,
1449
+ 1.46350000e+04, 1.50500000e+04, 1.53850000e+04, 1.56400000e+04,
1450
+ 1.58110000e+04]
1451
+
1452
+ periods = np.linspace(400, 120, 1000)
1453
+ angular_freq = 2 * np.pi / periods
1454
+
1455
+ lombscargle(t, y, angular_freq, precenter=True, normalize=True)
1456
+
1457
+ def test_zero_freq(self):
1458
+ # Verify that function works when freqs includes 0
1459
+ # The value at f=0 will depend on the seed
1460
+
1461
+ # Input parameters
1462
+ ampl = 2.
1463
+ w = 1.
1464
+ phi = 0.12
1465
+ nin = 100
1466
+ nout = 1001
1467
+ p = 0.7 # Fraction of points to select
1468
+ offset = 0
1469
+
1470
+ # Randomly select a fraction of an array with timesteps
1471
+ rng = np.random.RandomState(2353425)
1472
+ r = rng.rand(nin)
1473
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1474
+
1475
+ # Plot a sine wave for the selected times
1476
+ y = ampl * np.cos(w*t + phi) + offset
1477
+
1478
+ # Define the array of frequencies for which to compute the periodogram
1479
+ f = np.linspace(0, 10., nout)
1480
+
1481
+ # Calculate Lomb-Scargle periodogram
1482
+ pgram = lombscargle(t, y, f, normalize=True, floating_mean=True)
1483
+
1484
+ # exact value will change based on seed
1485
+ # testing to make sure it is very small
1486
+ assert(pgram[0] < 1e-4)
1487
+
1488
+ def test_simple_div_zero(self):
1489
+ # these are bare-minimum examples that would, without the eps adjustments,
1490
+ # cause division-by-zero errors
1491
+
1492
+ # first, test with example that will cause first SS sum to be 0.0
1493
+ t = [t + 1 for t in range(0, 32)]
1494
+ y = np.ones(len(t))
1495
+ freqs = [2.0*np.pi] * 2 # must have 2+ elements
1496
+ lombscargle(t, y, freqs)
1497
+
1498
+ # second, test with example that will cause first CC sum to be 0.0
1499
+ t = [t*4 + 1 for t in range(0, 32)]
1500
+ y = np.ones(len(t))
1501
+ freqs = [np.pi/2.0] * 2 # must have 2+ elements
1502
+
1503
+ lombscargle(t, y, freqs)
1504
+
1505
+ def test_input_mutation(self):
1506
+ # this tests for mutation of the input arrays
1507
+ # https://github.com/scipy/scipy/issues/23474
1508
+
1509
+ # Input parameters
1510
+ ampl = 2.
1511
+ w = 1.
1512
+ phi = 0.5 * np.pi
1513
+ nin = 100
1514
+ nout = 1000
1515
+ p = 0.7 # Fraction of points to select
1516
+
1517
+ # Randomly select a fraction of an array with timesteps
1518
+ rng = np.random.default_rng()
1519
+ r = rng.random(nin)
1520
+ t = np.linspace(0.01*np.pi, 10.*np.pi, nin)[r >= p]
1521
+
1522
+ # Plot a sine wave for the selected times
1523
+ y = ampl * np.sin(w*t + phi)
1524
+
1525
+ # Define the array of frequencies for which to compute the periodogram
1526
+ f = np.linspace(0.01, 10., nout)
1527
+
1528
+ weights = np.ones_like(y)
1529
+
1530
+ # create original copies before passing
1531
+ t_org = t.copy()
1532
+ y_org = y.copy()
1533
+ f_org = f.copy()
1534
+ weights_org = weights.copy()
1535
+
1536
+ lombscargle(t, y, f, precenter=True, weights=weights)
1537
+
1538
+ # check all 4 array inputs
1539
+ assert_array_equal(t, t_org)
1540
+ assert_array_equal(y, y_org)
1541
+ assert_array_equal(f, f_org)
1542
+ assert_array_equal(weights, weights_org)
1543
+
1544
+
1545
+ class TestSTFT:
1546
+ @pytest.mark.thread_unsafe
1547
+ def test_input_validation(self):
1548
+
1549
+ def chk_VE(match):
1550
+ """Assert for a ValueError matching regexp `match`.
1551
+
1552
+ This little wrapper allows a more concise code layout.
1553
+ """
1554
+ return pytest.raises(ValueError, match=match)
1555
+
1556
+ # Checks for check_COLA():
1557
+ with chk_VE('nperseg must be a positive integer'):
1558
+ check_COLA('hann', -10, 0)
1559
+ with chk_VE('noverlap must be less than nperseg.'):
1560
+ check_COLA('hann', 10, 20)
1561
+ with chk_VE('window must be 1-D'):
1562
+ check_COLA(np.ones((2, 2)), 10, 0)
1563
+ with chk_VE('window must have length of nperseg'):
1564
+ check_COLA(np.ones(20), 10, 0)
1565
+
1566
+ # Checks for check_NOLA():
1567
+ with chk_VE('nperseg must be a positive integer'):
1568
+ check_NOLA('hann', -10, 0)
1569
+ with chk_VE('noverlap must be less than nperseg'):
1570
+ check_NOLA('hann', 10, 20)
1571
+ with chk_VE('window must be 1-D'):
1572
+ check_NOLA(np.ones((2, 2)), 10, 0)
1573
+ with chk_VE('window must have length of nperseg'):
1574
+ check_NOLA(np.ones(20), 10, 0)
1575
+ with chk_VE('noverlap must be a nonnegative integer'):
1576
+ check_NOLA('hann', 64, -32)
1577
+
1578
+ x = np.zeros(1024)
1579
+ z = stft(x)[2]
1580
+
1581
+ # Checks for stft():
1582
+ with chk_VE('window must be 1-D'):
1583
+ stft(x, window=np.ones((2, 2)))
1584
+ with chk_VE('value specified for nperseg is different ' +
1585
+ 'from length of window'):
1586
+ stft(x, window=np.ones(10), nperseg=256)
1587
+ with chk_VE('nperseg must be a positive integer'):
1588
+ stft(x, nperseg=-256)
1589
+ with chk_VE('noverlap must be less than nperseg.'):
1590
+ stft(x, nperseg=256, noverlap=1024)
1591
+ with chk_VE('nfft must be greater than or equal to nperseg.'):
1592
+ stft(x, nperseg=256, nfft=8)
1593
+
1594
+ # Checks for istft():
1595
+ with chk_VE('Input stft must be at least 2d!'):
1596
+ istft(x)
1597
+ with chk_VE('window must be 1-D'):
1598
+ istft(z, window=np.ones((2, 2)))
1599
+ with chk_VE('window must have length of 256'):
1600
+ istft(z, window=np.ones(10), nperseg=256)
1601
+ with chk_VE('nperseg must be a positive integer'):
1602
+ istft(z, nperseg=-256)
1603
+ with chk_VE('noverlap must be less than nperseg.'):
1604
+ istft(z, nperseg=256, noverlap=1024)
1605
+ with chk_VE('nfft must be greater than or equal to nperseg.'):
1606
+ istft(z, nperseg=256, nfft=8)
1607
+ with pytest.warns(UserWarning, match="NOLA condition failed, " +
1608
+ "STFT may not be invertible"):
1609
+ istft(z, nperseg=256, noverlap=0, window='hann')
1610
+ with chk_VE('Must specify differing time and frequency axes!'):
1611
+ istft(z, time_axis=0, freq_axis=0)
1612
+
1613
+ # Checks for _spectral_helper():
1614
+ with chk_VE("Unknown value for mode foo, must be one of: " +
1615
+ r"\{'psd', 'stft'\}"):
1616
+ _spectral_helper(x, x, mode='foo')
1617
+ with chk_VE("x and y must be equal if mode is 'stft'"):
1618
+ _spectral_helper(x[:512], x[512:], mode='stft')
1619
+ with chk_VE("Unknown boundary option 'foo', must be one of: " +
1620
+ r"\['even', 'odd', 'constant', 'zeros', None\]"):
1621
+ _spectral_helper(x, x, boundary='foo')
1622
+
1623
+ scaling = "not_valid"
1624
+ with chk_VE(fr"Parameter {scaling=} not in \['spectrum', 'psd'\]!"):
1625
+ stft(x, scaling=scaling)
1626
+ with chk_VE(fr"Parameter {scaling=} not in \['spectrum', 'psd'\]!"):
1627
+ istft(z, scaling=scaling)
1628
+
1629
+ def test_check_COLA(self):
1630
+ settings = [
1631
+ ('boxcar', 10, 0),
1632
+ ('boxcar', 10, 9),
1633
+ ('bartlett', 51, 26),
1634
+ ('hann', 256, 128),
1635
+ ('hann', 256, 192),
1636
+ ('blackman', 300, 200),
1637
+ (('tukey', 0.5), 256, 64),
1638
+ ('hann', 256, 255),
1639
+ ]
1640
+
1641
+ for setting in settings:
1642
+ msg = '{}, {}, {}'.format(*setting)
1643
+ assert_equal(True, check_COLA(*setting), err_msg=msg)
1644
+
1645
+ def test_check_NOLA(self):
1646
+ settings_pass = [
1647
+ ('boxcar', 10, 0),
1648
+ ('boxcar', 10, 9),
1649
+ ('boxcar', 10, 7),
1650
+ ('bartlett', 51, 26),
1651
+ ('bartlett', 51, 10),
1652
+ ('hann', 256, 128),
1653
+ ('hann', 256, 192),
1654
+ ('hann', 256, 37),
1655
+ ('blackman', 300, 200),
1656
+ ('blackman', 300, 123),
1657
+ (('tukey', 0.5), 256, 64),
1658
+ (('tukey', 0.5), 256, 38),
1659
+ ('hann', 256, 255),
1660
+ ('hann', 256, 39),
1661
+ ]
1662
+ for setting in settings_pass:
1663
+ msg = '{}, {}, {}'.format(*setting)
1664
+ assert_equal(True, check_NOLA(*setting), err_msg=msg)
1665
+
1666
+ w_fail = np.ones(16)
1667
+ w_fail[::2] = 0
1668
+ settings_fail = [
1669
+ (w_fail, len(w_fail), len(w_fail) // 2),
1670
+ ('hann', 64, 0),
1671
+ ]
1672
+ for setting in settings_fail:
1673
+ msg = '{}, {}, {}'.format(*setting)
1674
+ assert_equal(False, check_NOLA(*setting), err_msg=msg)
1675
+
1676
+ def test_average_all_segments(self):
1677
+ rng = np.random.RandomState(1234)
1678
+ x = rng.randn(1024)
1679
+
1680
+ fs = 1.0
1681
+ window = 'hann'
1682
+ nperseg = 16
1683
+ noverlap = 8
1684
+
1685
+ # Compare twosided, because onesided welch doubles non-DC terms to
1686
+ # account for power at negative frequencies. stft doesn't do this,
1687
+ # because it breaks invertibility.
1688
+ f, _, Z = stft(x, fs, window, nperseg, noverlap, padded=False,
1689
+ return_onesided=False, boundary=None)
1690
+ fw, Pw = welch(x, fs, window, nperseg, noverlap, return_onesided=False,
1691
+ scaling='spectrum', detrend=False)
1692
+
1693
+ assert_allclose(f, fw)
1694
+ assert_allclose(np.mean(np.abs(Z)**2, axis=-1), Pw)
1695
+
1696
+ def test_permute_axes(self):
1697
+ rng = np.random.RandomState(1234)
1698
+ x = rng.randn(1024)
1699
+
1700
+ fs = 1.0
1701
+ window = 'hann'
1702
+ nperseg = 16
1703
+ noverlap = 8
1704
+
1705
+ f1, t1, Z1 = stft(x, fs, window, nperseg, noverlap)
1706
+ f2, t2, Z2 = stft(x.reshape((-1, 1, 1)), fs, window, nperseg, noverlap,
1707
+ axis=0)
1708
+
1709
+ t3, x1 = istft(Z1, fs, window, nperseg, noverlap)
1710
+ t4, x2 = istft(Z2.T, fs, window, nperseg, noverlap, time_axis=0,
1711
+ freq_axis=-1)
1712
+
1713
+ assert_allclose(f1, f2)
1714
+ assert_allclose(t1, t2)
1715
+ assert_allclose(t3, t4)
1716
+ assert_allclose(Z1, Z2[:, 0, 0, :])
1717
+ assert_allclose(x1, x2[:, 0, 0])
1718
+
1719
+ @pytest.mark.parametrize('scaling', ['spectrum', 'psd'])
1720
+ def test_roundtrip_real(self, scaling):
1721
+ rng = np.random.RandomState(1234)
1722
+
1723
+ settings = [
1724
+ ('boxcar', 100, 10, 0), # Test no overlap
1725
+ ('boxcar', 100, 10, 9), # Test high overlap
1726
+ ('bartlett', 101, 51, 26), # Test odd nperseg
1727
+ ('hann', 1024, 256, 128), # Test defaults
1728
+ (('tukey', 0.5), 1152, 256, 64), # Test Tukey
1729
+ ('hann', 1024, 256, 255), # Test overlapped hann
1730
+ ]
1731
+
1732
+ for window, N, nperseg, noverlap in settings:
1733
+ t = np.arange(N)
1734
+ x = 10*rng.randn(t.size)
1735
+
1736
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1737
+ window=window, detrend=None, padded=False,
1738
+ scaling=scaling)
1739
+
1740
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1741
+ window=window, scaling=scaling)
1742
+
1743
+ msg = f'{window}, {noverlap}'
1744
+ assert_allclose(t, tr, err_msg=msg)
1745
+ assert_allclose(x, xr, err_msg=msg)
1746
+
1747
+ @pytest.mark.thread_unsafe
1748
+ def test_roundtrip_not_nola(self):
1749
+ rng = np.random.RandomState(1234)
1750
+
1751
+ w_fail = np.ones(16)
1752
+ w_fail[::2] = 0
1753
+ settings = [
1754
+ (w_fail, 256, len(w_fail), len(w_fail) // 2),
1755
+ ('hann', 256, 64, 0),
1756
+ ]
1757
+
1758
+ for window, N, nperseg, noverlap in settings:
1759
+ msg = f'{window}, {N}, {nperseg}, {noverlap}'
1760
+ assert not check_NOLA(window, nperseg, noverlap), msg
1761
+
1762
+ t = np.arange(N)
1763
+ x = 10 * rng.randn(t.size)
1764
+
1765
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1766
+ window=window, detrend=None, padded=True,
1767
+ boundary='zeros')
1768
+ with pytest.warns(UserWarning, match='NOLA'):
1769
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1770
+ window=window, boundary=True)
1771
+
1772
+ assert np.allclose(t, tr[:len(t)]), msg
1773
+ assert not np.allclose(x, xr[:len(x)]), msg
1774
+
1775
+ def test_roundtrip_nola_not_cola(self):
1776
+ rng = np.random.RandomState(1234)
1777
+
1778
+ settings = [
1779
+ ('boxcar', 100, 10, 3), # NOLA True, COLA False
1780
+ ('bartlett', 101, 51, 37), # NOLA True, COLA False
1781
+ ('hann', 1024, 256, 127), # NOLA True, COLA False
1782
+ (('tukey', 0.5), 1152, 256, 14), # NOLA True, COLA False
1783
+ ('hann', 1024, 256, 5), # NOLA True, COLA False
1784
+ ]
1785
+
1786
+ for window, N, nperseg, noverlap in settings:
1787
+ msg = f'{window}, {nperseg}, {noverlap}'
1788
+ assert check_NOLA(window, nperseg, noverlap), msg
1789
+ assert not check_COLA(window, nperseg, noverlap), msg
1790
+
1791
+ t = np.arange(N)
1792
+ x = 10 * rng.randn(t.size)
1793
+
1794
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1795
+ window=window, detrend=None, padded=True,
1796
+ boundary='zeros')
1797
+
1798
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1799
+ window=window, boundary=True)
1800
+
1801
+ msg = f'{window}, {noverlap}'
1802
+ assert_allclose(t, tr[:len(t)], err_msg=msg)
1803
+ assert_allclose(x, xr[:len(x)], err_msg=msg)
1804
+
1805
+ def test_roundtrip_float32(self):
1806
+ rng = np.random.RandomState(1234)
1807
+
1808
+ settings = [('hann', 1024, 256, 128)]
1809
+
1810
+ for window, N, nperseg, noverlap in settings:
1811
+ t = np.arange(N)
1812
+ x = 10*rng.randn(t.size)
1813
+ x = x.astype(np.float32)
1814
+
1815
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1816
+ window=window, detrend=None, padded=False)
1817
+
1818
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1819
+ window=window)
1820
+
1821
+ msg = f'{window}, {noverlap}'
1822
+ assert_allclose(t, t, err_msg=msg)
1823
+ assert_allclose(x, xr, err_msg=msg, rtol=1e-4, atol=1e-5)
1824
+ assert_(x.dtype == xr.dtype)
1825
+
1826
+ @pytest.mark.thread_unsafe
1827
+ @pytest.mark.parametrize('scaling', ['spectrum', 'psd'])
1828
+ def test_roundtrip_complex(self, scaling):
1829
+ rng = np.random.RandomState(1234)
1830
+
1831
+ settings = [
1832
+ ('boxcar', 100, 10, 0), # Test no overlap
1833
+ ('boxcar', 100, 10, 9), # Test high overlap
1834
+ ('bartlett', 101, 51, 26), # Test odd nperseg
1835
+ ('hann', 1024, 256, 128), # Test defaults
1836
+ (('tukey', 0.5), 1152, 256, 64), # Test Tukey
1837
+ ('hann', 1024, 256, 255), # Test overlapped hann
1838
+ ]
1839
+
1840
+ for window, N, nperseg, noverlap in settings:
1841
+ t = np.arange(N)
1842
+ x = 10*rng.randn(t.size) + 10j*rng.randn(t.size)
1843
+
1844
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1845
+ window=window, detrend=None, padded=False,
1846
+ return_onesided=False, scaling=scaling)
1847
+
1848
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1849
+ window=window, input_onesided=False,
1850
+ scaling=scaling)
1851
+
1852
+ msg = f'{window}, {nperseg}, {noverlap}'
1853
+ assert_allclose(t, tr, err_msg=msg)
1854
+ assert_allclose(x, xr, err_msg=msg)
1855
+
1856
+ # Check that asking for onesided switches to twosided
1857
+ with suppress_warnings() as sup:
1858
+ sup.filter(UserWarning,
1859
+ "Input data is complex, switching to return_onesided=False")
1860
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1861
+ window=window, detrend=None, padded=False,
1862
+ return_onesided=True, scaling=scaling)
1863
+
1864
+ tr, xr = istft(zz, nperseg=nperseg, noverlap=noverlap,
1865
+ window=window, input_onesided=False, scaling=scaling)
1866
+
1867
+ msg = f'{window}, {nperseg}, {noverlap}'
1868
+ assert_allclose(t, tr, err_msg=msg)
1869
+ assert_allclose(x, xr, err_msg=msg)
1870
+
1871
+ def test_roundtrip_boundary_extension(self):
1872
+ rng = np.random.RandomState(1234)
1873
+
1874
+ # Test against boxcar, since window is all ones, and thus can be fully
1875
+ # recovered with no boundary extension
1876
+
1877
+ settings = [
1878
+ ('boxcar', 100, 10, 0), # Test no overlap
1879
+ ('boxcar', 100, 10, 9), # Test high overlap
1880
+ ]
1881
+
1882
+ for window, N, nperseg, noverlap in settings:
1883
+ t = np.arange(N)
1884
+ x = 10*rng.randn(t.size)
1885
+
1886
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1887
+ window=window, detrend=None, padded=True,
1888
+ boundary=None)
1889
+
1890
+ _, xr = istft(zz, noverlap=noverlap, window=window, boundary=False)
1891
+
1892
+ for boundary in ['even', 'odd', 'constant', 'zeros']:
1893
+ _, _, zz_ext = stft(x, nperseg=nperseg, noverlap=noverlap,
1894
+ window=window, detrend=None, padded=True,
1895
+ boundary=boundary)
1896
+
1897
+ _, xr_ext = istft(zz_ext, noverlap=noverlap, window=window,
1898
+ boundary=True)
1899
+
1900
+ msg = f'{window}, {noverlap}, {boundary}'
1901
+ assert_allclose(x, xr, err_msg=msg)
1902
+ assert_allclose(x, xr_ext, err_msg=msg)
1903
+
1904
+ def test_roundtrip_padded_signal(self):
1905
+ rng = np.random.RandomState(1234)
1906
+
1907
+ settings = [
1908
+ ('boxcar', 101, 10, 0),
1909
+ ('hann', 1000, 256, 128),
1910
+ ]
1911
+
1912
+ for window, N, nperseg, noverlap in settings:
1913
+ t = np.arange(N)
1914
+ x = 10*rng.randn(t.size)
1915
+
1916
+ _, _, zz = stft(x, nperseg=nperseg, noverlap=noverlap,
1917
+ window=window, detrend=None, padded=True)
1918
+
1919
+ tr, xr = istft(zz, noverlap=noverlap, window=window)
1920
+
1921
+ msg = f'{window}, {noverlap}'
1922
+ # Account for possible zero-padding at the end
1923
+ assert_allclose(t, tr[:t.size], err_msg=msg)
1924
+ assert_allclose(x, xr[:x.size], err_msg=msg)
1925
+
1926
+ def test_roundtrip_padded_FFT(self):
1927
+ rng = np.random.RandomState(1234)
1928
+
1929
+ settings = [
1930
+ ('hann', 1024, 256, 128, 512),
1931
+ ('hann', 1024, 256, 128, 501),
1932
+ ('boxcar', 100, 10, 0, 33),
1933
+ (('tukey', 0.5), 1152, 256, 64, 1024),
1934
+ ]
1935
+
1936
+ for window, N, nperseg, noverlap, nfft in settings:
1937
+ t = np.arange(N)
1938
+ x = 10*rng.randn(t.size)
1939
+ xc = x*np.exp(1j*np.pi/4)
1940
+
1941
+ # real signal
1942
+ _, _, z = stft(x, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1943
+ window=window, detrend=None, padded=True)
1944
+
1945
+ # complex signal
1946
+ _, _, zc = stft(xc, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1947
+ window=window, detrend=None, padded=True,
1948
+ return_onesided=False)
1949
+
1950
+ tr, xr = istft(z, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1951
+ window=window)
1952
+
1953
+ tr, xcr = istft(zc, nperseg=nperseg, noverlap=noverlap, nfft=nfft,
1954
+ window=window, input_onesided=False)
1955
+
1956
+ msg = f'{window}, {noverlap}'
1957
+ assert_allclose(t, tr, err_msg=msg)
1958
+ assert_allclose(x, xr, err_msg=msg)
1959
+ assert_allclose(xc, xcr, err_msg=msg)
1960
+
1961
+ def test_axis_rolling(self):
1962
+ rng = np.random.RandomState(1234)
1963
+
1964
+ x_flat = rng.randn(1024)
1965
+ _, _, z_flat = stft(x_flat)
1966
+
1967
+ for a in range(3):
1968
+ newshape = [1,]*3
1969
+ newshape[a] = -1
1970
+ x = x_flat.reshape(newshape)
1971
+
1972
+ _, _, z_plus = stft(x, axis=a) # Positive axis index
1973
+ _, _, z_minus = stft(x, axis=a-x.ndim) # Negative axis index
1974
+
1975
+ assert_equal(z_flat, z_plus.squeeze(), err_msg=a)
1976
+ assert_equal(z_flat, z_minus.squeeze(), err_msg=a-x.ndim)
1977
+
1978
+ # z_flat has shape [n_freq, n_time]
1979
+
1980
+ # Test vs. transpose
1981
+ _, x_transpose_m = istft(z_flat.T, time_axis=-2, freq_axis=-1)
1982
+ _, x_transpose_p = istft(z_flat.T, time_axis=0, freq_axis=1)
1983
+
1984
+ assert_allclose(x_flat, x_transpose_m, err_msg='istft transpose minus')
1985
+ assert_allclose(x_flat, x_transpose_p, err_msg='istft transpose plus')
1986
+
1987
+ def test_roundtrip_scaling(self):
1988
+ """Verify behavior of scaling parameter. """
1989
+ # Create 1024 sample cosine signal with amplitude 2:
1990
+ X = np.zeros(513, dtype=complex)
1991
+ X[256] = 1024
1992
+ x = np.fft.irfft(X)
1993
+ power_x = sum(x**2) / len(x) # power of signal x is 2
1994
+
1995
+ # Calculate magnitude-scaled STFT:
1996
+ Zs = stft(x, boundary='even', scaling='spectrum')[2]
1997
+
1998
+ # Test round trip:
1999
+ x1 = istft(Zs, boundary=True, scaling='spectrum')[1]
2000
+ assert_allclose(x1, x)
2001
+
2002
+ # For a Hann-windowed 256 sample length FFT, we expect a peak at
2003
+ # frequency 64 (since it is 1/4 the length of X) with a height of 1
2004
+ # (half the amplitude). A Hann window of a perfectly centered sine has
2005
+ # the magnitude [..., 0, 0, 0.5, 1, 0.5, 0, 0, ...].
2006
+ # Note that in this case the 'even' padding works for the beginning
2007
+ # but not for the end of the STFT.
2008
+ assert_allclose(abs(Zs[63, :-1]), 0.5)
2009
+ assert_allclose(abs(Zs[64, :-1]), 1)
2010
+ assert_allclose(abs(Zs[65, :-1]), 0.5)
2011
+ # All other values should be zero:
2012
+ Zs[63:66, :-1] = 0
2013
+ # Note since 'rtol' does not have influence here, atol needs to be set:
2014
+ assert_allclose(Zs[:, :-1], 0, atol=np.finfo(Zs.dtype).resolution)
2015
+
2016
+ # Calculate two-sided psd-scaled STFT:
2017
+ # - using 'even' padding since signal is axis symmetric - this ensures
2018
+ # stationary behavior on the boundaries
2019
+ # - using the two-sided transform allows determining the spectral
2020
+ # power by `sum(abs(Zp[:, k])**2) / len(f)` for the k-th time slot.
2021
+ Zp = stft(x, return_onesided=False, boundary='even', scaling='psd')[2]
2022
+
2023
+ # Calculate spectral power of Zd by summing over the frequency axis:
2024
+ psd_Zp = np.sum(Zp.real**2 + Zp.imag**2, axis=0) / Zp.shape[0]
2025
+ # Spectral power of Zp should be equal to the signal's power:
2026
+ assert_allclose(psd_Zp, power_x)
2027
+
2028
+ # Test round trip:
2029
+ x1 = istft(Zp, input_onesided=False, boundary=True, scaling='psd')[1]
2030
+ assert_allclose(x1, x)
2031
+
2032
+ # The power of the one-sided psd-scaled STFT can be determined
2033
+ # analogously (note that the two sides are not of equal shape):
2034
+ Zp0 = stft(x, return_onesided=True, boundary='even', scaling='psd')[2]
2035
+
2036
+ # Since x is real, its Fourier transform is conjugate symmetric, i.e.,
2037
+ # the missing 'second side' can be expressed through the 'first side':
2038
+ Zp1 = np.conj(Zp0[-2:0:-1, :]) # 'second side' is conjugate reversed
2039
+ assert_allclose(Zp[:129, :], Zp0)
2040
+ assert_allclose(Zp[129:, :], Zp1)
2041
+
2042
+ # Calculate the spectral power:
2043
+ s2 = (np.sum(Zp0.real ** 2 + Zp0.imag ** 2, axis=0) +
2044
+ np.sum(Zp1.real ** 2 + Zp1.imag ** 2, axis=0))
2045
+ psd_Zp01 = s2 / (Zp0.shape[0] + Zp1.shape[0])
2046
+ assert_allclose(psd_Zp01, power_x)
2047
+
2048
+ # Test round trip:
2049
+ x1 = istft(Zp0, input_onesided=True, boundary=True, scaling='psd')[1]
2050
+ assert_allclose(x1, x)
2051
+
2052
+
2053
+ class TestSampledSpectralRepresentations:
2054
+ """Check energy/power relations from `Spectral Analysis` section in the user guide.
2055
+
2056
+ A 32 sample cosine signal is used to compare the numerical to the expected results
2057
+ stated in :ref:`tutorial_SpectralAnalysis` in
2058
+ file ``doc/source/tutorial/signal.rst``
2059
+ """
2060
+ n: int = 32 #: number of samples
2061
+ T: float = 1/16 #: sampling interval
2062
+ a_ref: float = 3 #: amplitude of reference
2063
+ l_a: int = 3 #: index in fft for defining frequency of test signal
2064
+
2065
+ x_ref: np.ndarray #: reference signal
2066
+ X_ref: np.ndarray #: two-sided FFT of x_ref
2067
+ E_ref: float #: energy of signal
2068
+ P_ref: float #: power of signal
2069
+
2070
+ def setup_method(self):
2071
+ """Create Cosine signal with amplitude a from spectrum. """
2072
+ f = rfftfreq(self.n, self.T)
2073
+ X_ref = np.zeros_like(f)
2074
+ self.l_a = 3
2075
+ X_ref[self.l_a] = self.a_ref/2 * self.n # set amplitude
2076
+ self.x_ref = irfft(X_ref)
2077
+ self.X_ref = fft(self.x_ref)
2078
+
2079
+ # Closed form expression for continuous-time signal:
2080
+ self.E_ref = self.tau * self.a_ref**2 / 2 # energy of signal
2081
+ self.P_ref = self.a_ref**2 / 2 # power of signal
2082
+
2083
+ @property
2084
+ def tau(self) -> float:
2085
+ """Duration of signal. """
2086
+ return self.n * self.T
2087
+
2088
+ @property
2089
+ def delta_f(self) -> float:
2090
+ """Bin width """
2091
+ return 1 / (self.n * self.T)
2092
+
2093
+ def test_reference_signal(self):
2094
+ """Test energy and power formulas. """
2095
+ # Verify that amplitude is a:
2096
+ assert_allclose(2*self.a_ref, np.ptp(self.x_ref), rtol=0.1)
2097
+ # Verify that energy expression for sampled signal:
2098
+ assert_allclose(self.T * sum(self.x_ref ** 2), self.E_ref)
2099
+
2100
+ # Verify that spectral energy and power formulas are correct:
2101
+ sum_X_ref_squared = sum(self.X_ref.real**2 + self.X_ref.imag**2)
2102
+ assert_allclose(self.T/self.n * sum_X_ref_squared, self.E_ref)
2103
+ assert_allclose(1/self.n**2 * sum_X_ref_squared, self.P_ref)
2104
+
2105
+ def test_windowed_DFT(self):
2106
+ """Verify spectral representations of windowed DFT.
2107
+
2108
+ Furthermore, the scalings of `periodogram` and `welch` are verified.
2109
+ """
2110
+ w = hann(self.n, sym=False)
2111
+ c_amp, c_rms = abs(sum(w)), np.sqrt(sum(w.real**2 + w.imag**2))
2112
+ Xw = fft(self.x_ref*w) # unnormalized windowed DFT
2113
+
2114
+ # Verify that the *spectrum* peak is consistent:
2115
+ assert_allclose(self.tau * Xw[self.l_a] / c_amp, self.a_ref * self.tau / 2)
2116
+ # Verify that the *amplitude spectrum* peak is consistent:
2117
+ assert_allclose(Xw[self.l_a] / c_amp, self.a_ref/2)
2118
+
2119
+ # Verify spectral power/energy equals signal's power/energy:
2120
+ X_ESD = self.tau * self.T * abs(Xw / c_rms)**2 # Energy Spectral Density
2121
+ X_PSD = self.T * abs(Xw / c_rms)**2 # Power Spectral Density
2122
+ assert_allclose(self.delta_f * sum(X_ESD), self.E_ref)
2123
+ assert_allclose(self.delta_f * sum(X_PSD), self.P_ref)
2124
+
2125
+ # Verify scalings of periodogram:
2126
+ kw = dict(fs=1/self.T, window=w, detrend=False, return_onesided=False)
2127
+ _, P_mag = periodogram(self.x_ref, scaling='spectrum', **kw)
2128
+ _, P_psd = periodogram(self.x_ref, scaling='density', **kw)
2129
+
2130
+ # Verify that periodogram calculates a squared magnitude spectrum:
2131
+ float_res = np.finfo(P_mag.dtype).resolution
2132
+ assert_allclose(P_mag, abs(Xw/c_amp)**2, atol=float_res*max(P_mag))
2133
+ # Verify that periodogram calculates a PSD:
2134
+ assert_allclose(P_psd, X_PSD, atol=float_res*max(P_psd))
2135
+
2136
+ # Ensure that scaling of welch is the same as of periodogram:
2137
+ kw = dict(nperseg=len(self.x_ref), noverlap=0, **kw)
2138
+ assert_allclose(welch(self.x_ref, scaling='spectrum', **kw)[1], P_mag,
2139
+ atol=float_res*max(P_mag))
2140
+ assert_allclose(welch(self.x_ref, scaling='density', **kw)[1], P_psd,
2141
+ atol=float_res*max(P_psd))