scipy 1.16.2__cp313-cp313-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.cp313-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp313-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.cp313-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp313-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.cp313-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp313-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.cp313-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp313-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp313-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp313-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp313-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp313-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.cp313-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp313-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.cp313-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp313-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.cp313-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp313-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp313-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp313-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp313-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp313-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.cp313-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp313-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.cp313-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp313-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.cp313-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp313-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.cp313-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp313-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp313-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp313-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.cp313-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp313-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.cp313-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp313-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp313-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp313-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp313-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp313-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.cp313-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp313-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp313-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp313-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp313-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp313-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.cp313-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp313-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.cp313-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp313-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp313-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp313-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp313-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp313-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.cp313-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp313-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.cp313-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp313-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.cp313-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp313-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp313-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp313-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp313-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp313-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.cp313-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp313-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.cp313-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp313-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.cp313-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp313-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.cp313-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp313-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp313-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp313-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp313-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp313-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp313-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp313-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp313-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp313-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.cp313-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp313-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp313-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp313-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.cp313-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp313-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.cp313-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp313-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.cp313-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp313-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.cp313-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp313-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp313-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp313-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.cp313-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp313-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.cp313-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp313-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp313-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp313-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.cp313-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp313-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.cp313-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp313-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.cp313-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp313-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.cp313-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp313-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.cp313-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp313-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp313-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp313-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.cp313-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp313-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.cp313-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp313-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.cp313-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp313-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.cp313-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp313-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp313-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp313-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.cp313-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp313-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.cp313-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp313-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.cp313-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp313-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.cp313-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp313-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.cp313-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp313-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.cp313-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp313-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp313-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp313-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.cp313-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp313-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp313-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp313-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp313-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp313-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.cp313-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp313-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.cp313-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp313-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.cp313-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp313-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.cp313-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp313-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp313-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp313-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp313-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp313-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp313-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp313-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp313-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp313-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp313-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp313-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp313-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.cp313-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp313-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.cp313-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313-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.cp313-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp313-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp313-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp313-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp313-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp313-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp313-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp313-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.cp313-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp313-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp313-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp313-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp313-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp313-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp313-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp313-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.cp313-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp313-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp313-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp313-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.cp313-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp313-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp313-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp313-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.cp313-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp313-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp313-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp313-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp313-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp313-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.cp313-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp313-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp313-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp313-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.cp313-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp313-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp313-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp313-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp313-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp313-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.cp313-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp313-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.cp313-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp313-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp313-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp313-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.cp313-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp313-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.cp313-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp313-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.cp313-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp313-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.cp313-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp313-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.cp313-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp313-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.cp313-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp313-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.cp313-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp313-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.cp313-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp313-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,1310 @@
1
+ """
2
+ Functions for identifying peaks in signals.
3
+ """
4
+ import math
5
+ import numpy as np
6
+
7
+ from scipy.signal._wavelets import _cwt, _ricker
8
+ from scipy.stats import scoreatpercentile
9
+
10
+ from ._peak_finding_utils import (
11
+ _local_maxima_1d,
12
+ _select_by_peak_distance,
13
+ _peak_prominences,
14
+ _peak_widths
15
+ )
16
+
17
+
18
+ __all__ = ['argrelmin', 'argrelmax', 'argrelextrema', 'peak_prominences',
19
+ 'peak_widths', 'find_peaks', 'find_peaks_cwt']
20
+
21
+
22
+ def _boolrelextrema(data, comparator, axis=0, order=1, mode='clip'):
23
+ """
24
+ Calculate the relative extrema of `data`.
25
+
26
+ Relative extrema are calculated by finding locations where
27
+ ``comparator(data[n], data[n+1:n+order+1])`` is True.
28
+
29
+ Parameters
30
+ ----------
31
+ data : ndarray
32
+ Array in which to find the relative extrema.
33
+ comparator : callable
34
+ Function to use to compare two data points.
35
+ Should take two arrays as arguments.
36
+ axis : int, optional
37
+ Axis over which to select from `data`. Default is 0.
38
+ order : int, optional
39
+ How many points on each side to use for the comparison
40
+ to consider ``comparator(n,n+x)`` to be True.
41
+ mode : str, optional
42
+ How the edges of the vector are treated. 'wrap' (wrap around) or
43
+ 'clip' (treat overflow as the same as the last (or first) element).
44
+ Default 'clip'. See numpy.take.
45
+
46
+ Returns
47
+ -------
48
+ extrema : ndarray
49
+ Boolean array of the same shape as `data` that is True at an extrema,
50
+ False otherwise.
51
+
52
+ See also
53
+ --------
54
+ argrelmax, argrelmin
55
+
56
+ Examples
57
+ --------
58
+ >>> import numpy as np
59
+ >>> from scipy.signal._peak_finding import _boolrelextrema
60
+ >>> testdata = np.array([1,2,3,2,1])
61
+ >>> _boolrelextrema(testdata, np.greater, axis=0)
62
+ array([False, False, True, False, False], dtype=bool)
63
+
64
+ """
65
+ if (int(order) != order) or (order < 1):
66
+ raise ValueError('Order must be an int >= 1')
67
+
68
+ datalen = data.shape[axis]
69
+ locs = np.arange(0, datalen)
70
+
71
+ results = np.ones(data.shape, dtype=bool)
72
+ main = data.take(locs, axis=axis, mode=mode)
73
+ for shift in range(1, order + 1):
74
+ plus = data.take(locs + shift, axis=axis, mode=mode)
75
+ minus = data.take(locs - shift, axis=axis, mode=mode)
76
+ results &= comparator(main, plus)
77
+ results &= comparator(main, minus)
78
+ if ~results.any():
79
+ return results
80
+ return results
81
+
82
+
83
+ def argrelmin(data, axis=0, order=1, mode='clip'):
84
+ """
85
+ Calculate the relative minima of `data`.
86
+
87
+ Parameters
88
+ ----------
89
+ data : ndarray
90
+ Array in which to find the relative minima.
91
+ axis : int, optional
92
+ Axis over which to select from `data`. Default is 0.
93
+ order : int, optional
94
+ How many points on each side to use for the comparison
95
+ to consider ``comparator(n, n+x)`` to be True.
96
+ mode : str, optional
97
+ How the edges of the vector are treated.
98
+ Available options are 'wrap' (wrap around) or 'clip' (treat overflow
99
+ as the same as the last (or first) element).
100
+ Default 'clip'. See numpy.take.
101
+
102
+ Returns
103
+ -------
104
+ extrema : tuple of ndarrays
105
+ Indices of the minima in arrays of integers. ``extrema[k]`` is
106
+ the array of indices of axis `k` of `data`. Note that the
107
+ return value is a tuple even when `data` is 1-D.
108
+
109
+ See Also
110
+ --------
111
+ argrelextrema, argrelmax, find_peaks
112
+
113
+ Notes
114
+ -----
115
+ This function uses `argrelextrema` with np.less as comparator. Therefore, it
116
+ requires a strict inequality on both sides of a value to consider it a
117
+ minimum. This means flat minima (more than one sample wide) are not detected.
118
+ In case of 1-D `data` `find_peaks` can be used to detect all
119
+ local minima, including flat ones, by calling it with negated `data`.
120
+
121
+ .. versionadded:: 0.11.0
122
+
123
+ Examples
124
+ --------
125
+ >>> import numpy as np
126
+ >>> from scipy.signal import argrelmin
127
+ >>> x = np.array([2, 1, 2, 3, 2, 0, 1, 0])
128
+ >>> argrelmin(x)
129
+ (array([1, 5]),)
130
+ >>> y = np.array([[1, 2, 1, 2],
131
+ ... [2, 2, 0, 0],
132
+ ... [5, 3, 4, 4]])
133
+ ...
134
+ >>> argrelmin(y, axis=1)
135
+ (array([0, 2]), array([2, 1]))
136
+
137
+ """
138
+ return argrelextrema(data, np.less, axis, order, mode)
139
+
140
+
141
+ def argrelmax(data, axis=0, order=1, mode='clip'):
142
+ """
143
+ Calculate the relative maxima of `data`.
144
+
145
+ Parameters
146
+ ----------
147
+ data : ndarray
148
+ Array in which to find the relative maxima.
149
+ axis : int, optional
150
+ Axis over which to select from `data`. Default is 0.
151
+ order : int, optional
152
+ How many points on each side to use for the comparison
153
+ to consider ``comparator(n, n+x)`` to be True.
154
+ mode : str, optional
155
+ How the edges of the vector are treated.
156
+ Available options are 'wrap' (wrap around) or 'clip' (treat overflow
157
+ as the same as the last (or first) element).
158
+ Default 'clip'. See `numpy.take`.
159
+
160
+ Returns
161
+ -------
162
+ extrema : tuple of ndarrays
163
+ Indices of the maxima in arrays of integers. ``extrema[k]`` is
164
+ the array of indices of axis `k` of `data`. Note that the
165
+ return value is a tuple even when `data` is 1-D.
166
+
167
+ See Also
168
+ --------
169
+ argrelextrema, argrelmin, find_peaks
170
+
171
+ Notes
172
+ -----
173
+ This function uses `argrelextrema` with np.greater as comparator. Therefore,
174
+ it requires a strict inequality on both sides of a value to consider it a
175
+ maximum. This means flat maxima (more than one sample wide) are not detected.
176
+ In case of 1-D `data` `find_peaks` can be used to detect all
177
+ local maxima, including flat ones.
178
+
179
+ .. versionadded:: 0.11.0
180
+
181
+ Examples
182
+ --------
183
+ >>> import numpy as np
184
+ >>> from scipy.signal import argrelmax
185
+ >>> x = np.array([2, 1, 2, 3, 2, 0, 1, 0])
186
+ >>> argrelmax(x)
187
+ (array([3, 6]),)
188
+ >>> y = np.array([[1, 2, 1, 2],
189
+ ... [2, 2, 0, 0],
190
+ ... [5, 3, 4, 4]])
191
+ ...
192
+ >>> argrelmax(y, axis=1)
193
+ (array([0]), array([1]))
194
+ """
195
+ return argrelextrema(data, np.greater, axis, order, mode)
196
+
197
+
198
+ def argrelextrema(data, comparator, axis=0, order=1, mode='clip'):
199
+ """
200
+ Calculate the relative extrema of `data`.
201
+
202
+ Parameters
203
+ ----------
204
+ data : ndarray
205
+ Array in which to find the relative extrema.
206
+ comparator : callable
207
+ Function to use to compare two data points.
208
+ Should take two arrays as arguments.
209
+ axis : int, optional
210
+ Axis over which to select from `data`. Default is 0.
211
+ order : int, optional
212
+ How many points on each side to use for the comparison
213
+ to consider ``comparator(n, n+x)`` to be True.
214
+ mode : str, optional
215
+ How the edges of the vector are treated. 'wrap' (wrap around) or
216
+ 'clip' (treat overflow as the same as the last (or first) element).
217
+ Default is 'clip'. See `numpy.take`.
218
+
219
+ Returns
220
+ -------
221
+ extrema : tuple of ndarrays
222
+ Indices of the maxima in arrays of integers. ``extrema[k]`` is
223
+ the array of indices of axis `k` of `data`. Note that the
224
+ return value is a tuple even when `data` is 1-D.
225
+
226
+ See Also
227
+ --------
228
+ argrelmin, argrelmax
229
+
230
+ Notes
231
+ -----
232
+
233
+ .. versionadded:: 0.11.0
234
+
235
+ Examples
236
+ --------
237
+ >>> import numpy as np
238
+ >>> from scipy.signal import argrelextrema
239
+ >>> x = np.array([2, 1, 2, 3, 2, 0, 1, 0])
240
+ >>> argrelextrema(x, np.greater)
241
+ (array([3, 6]),)
242
+ >>> y = np.array([[1, 2, 1, 2],
243
+ ... [2, 2, 0, 0],
244
+ ... [5, 3, 4, 4]])
245
+ ...
246
+ >>> argrelextrema(y, np.less, axis=1)
247
+ (array([0, 2]), array([2, 1]))
248
+
249
+ """
250
+ results = _boolrelextrema(data, comparator,
251
+ axis, order, mode)
252
+ return np.nonzero(results)
253
+
254
+
255
+ def _arg_x_as_expected(value):
256
+ """Ensure argument `x` is a 1-D C-contiguous array of dtype('float64').
257
+
258
+ Used in `find_peaks`, `peak_prominences` and `peak_widths` to make `x`
259
+ compatible with the signature of the wrapped Cython functions.
260
+
261
+ Returns
262
+ -------
263
+ value : ndarray
264
+ A 1-D C-contiguous array with dtype('float64').
265
+ """
266
+ value = np.asarray(value, order='C', dtype=np.float64)
267
+ if value.ndim != 1:
268
+ raise ValueError('`x` must be a 1-D array')
269
+ return value
270
+
271
+
272
+ def _arg_peaks_as_expected(value):
273
+ """Ensure argument `peaks` is a 1-D C-contiguous array of dtype('intp').
274
+
275
+ Used in `peak_prominences` and `peak_widths` to make `peaks` compatible
276
+ with the signature of the wrapped Cython functions.
277
+
278
+ Returns
279
+ -------
280
+ value : ndarray
281
+ A 1-D C-contiguous array with dtype('intp').
282
+ """
283
+ value = np.asarray(value)
284
+ if value.size == 0:
285
+ # Empty arrays default to np.float64 but are valid input
286
+ value = np.array([], dtype=np.intp)
287
+ try:
288
+ # Safely convert to C-contiguous array of type np.intp
289
+ value = value.astype(np.intp, order='C', casting='safe',
290
+ subok=False, copy=False)
291
+ except TypeError as e:
292
+ raise TypeError("cannot safely cast `peaks` to dtype('intp')") from e
293
+ if value.ndim != 1:
294
+ raise ValueError('`peaks` must be a 1-D array')
295
+ return value
296
+
297
+
298
+ def _arg_wlen_as_expected(value):
299
+ """Ensure argument `wlen` is of type `np.intp` and larger than 1.
300
+
301
+ Used in `peak_prominences` and `peak_widths`.
302
+
303
+ Returns
304
+ -------
305
+ value : np.intp
306
+ The original `value` rounded up to an integer or -1 if `value` was
307
+ None.
308
+ """
309
+ if value is None:
310
+ # _peak_prominences expects an intp; -1 signals that no value was
311
+ # supplied by the user
312
+ value = -1
313
+ elif 1 < value:
314
+ # Round up to a positive integer
315
+ if isinstance(value, float):
316
+ value = math.ceil(value)
317
+ value = np.intp(value)
318
+ else:
319
+ raise ValueError(f'`wlen` must be larger than 1, was {value}')
320
+ return value
321
+
322
+
323
+ def peak_prominences(x, peaks, wlen=None):
324
+ """
325
+ Calculate the prominence of each peak in a signal.
326
+
327
+ The prominence of a peak measures how much a peak stands out from the
328
+ surrounding baseline of the signal and is defined as the vertical distance
329
+ between the peak and its lowest contour line.
330
+
331
+ Parameters
332
+ ----------
333
+ x : sequence
334
+ A signal with peaks.
335
+ peaks : sequence
336
+ Indices of peaks in `x`.
337
+ wlen : int, optional
338
+ A window length in samples that optionally limits the evaluated area for
339
+ each peak to a subset of `x`. The peak is always placed in the middle of
340
+ the window therefore the given length is rounded up to the next odd
341
+ integer. This parameter can speed up the calculation (see Notes).
342
+
343
+ Returns
344
+ -------
345
+ prominences : ndarray
346
+ The calculated prominences for each peak in `peaks`.
347
+ left_bases, right_bases : ndarray
348
+ The peaks' bases as indices in `x` to the left and right of each peak.
349
+ The higher base of each pair is a peak's lowest contour line.
350
+
351
+ Raises
352
+ ------
353
+ ValueError
354
+ If a value in `peaks` is an invalid index for `x`.
355
+
356
+ Warns
357
+ -----
358
+ PeakPropertyWarning
359
+ For indices in `peaks` that don't point to valid local maxima in `x`,
360
+ the returned prominence will be 0 and this warning is raised. This
361
+ also happens if `wlen` is smaller than the plateau size of a peak.
362
+
363
+ Warnings
364
+ --------
365
+ This function may return unexpected results for data containing NaNs. To
366
+ avoid this, NaNs should either be removed or replaced.
367
+
368
+ See Also
369
+ --------
370
+ find_peaks
371
+ Find peaks inside a signal based on peak properties.
372
+ peak_widths
373
+ Calculate the width of peaks.
374
+
375
+ Notes
376
+ -----
377
+ Strategy to compute a peak's prominence:
378
+
379
+ 1. Extend a horizontal line from the current peak to the left and right
380
+ until the line either reaches the window border (see `wlen`) or
381
+ intersects the signal again at the slope of a higher peak. An
382
+ intersection with a peak of the same height is ignored.
383
+ 2. On each side find the minimal signal value within the interval defined
384
+ above. These points are the peak's bases.
385
+ 3. The higher one of the two bases marks the peak's lowest contour line. The
386
+ prominence can then be calculated as the vertical difference between the
387
+ peaks height itself and its lowest contour line.
388
+
389
+ Searching for the peak's bases can be slow for large `x` with periodic
390
+ behavior because large chunks or even the full signal need to be evaluated
391
+ for the first algorithmic step. This evaluation area can be limited with the
392
+ parameter `wlen` which restricts the algorithm to a window around the
393
+ current peak and can shorten the calculation time if the window length is
394
+ short in relation to `x`.
395
+ However, this may stop the algorithm from finding the true global contour
396
+ line if the peak's true bases are outside this window. Instead, a higher
397
+ contour line is found within the restricted window leading to a smaller
398
+ calculated prominence. In practice, this is only relevant for the highest set
399
+ of peaks in `x`. This behavior may even be used intentionally to calculate
400
+ "local" prominences.
401
+
402
+ .. versionadded:: 1.1.0
403
+
404
+ References
405
+ ----------
406
+ .. [1] Wikipedia Article for Topographic Prominence:
407
+ https://en.wikipedia.org/wiki/Topographic_prominence
408
+
409
+ Examples
410
+ --------
411
+ >>> import numpy as np
412
+ >>> from scipy.signal import find_peaks, peak_prominences
413
+ >>> import matplotlib.pyplot as plt
414
+
415
+ Create a test signal with two overlaid harmonics
416
+
417
+ >>> x = np.linspace(0, 6 * np.pi, 1000)
418
+ >>> x = np.sin(x) + 0.6 * np.sin(2.6 * x)
419
+
420
+ Find all peaks and calculate prominences
421
+
422
+ >>> peaks, _ = find_peaks(x)
423
+ >>> prominences = peak_prominences(x, peaks)[0]
424
+ >>> prominences
425
+ array([1.24159486, 0.47840168, 0.28470524, 3.10716793, 0.284603 ,
426
+ 0.47822491, 2.48340261, 0.47822491])
427
+
428
+ Calculate the height of each peak's contour line and plot the results
429
+
430
+ >>> contour_heights = x[peaks] - prominences
431
+ >>> plt.plot(x)
432
+ >>> plt.plot(peaks, x[peaks], "x")
433
+ >>> plt.vlines(x=peaks, ymin=contour_heights, ymax=x[peaks])
434
+ >>> plt.show()
435
+
436
+ Let's evaluate a second example that demonstrates several edge cases for
437
+ one peak at index 5.
438
+
439
+ >>> x = np.array([0, 1, 0, 3, 1, 3, 0, 4, 0])
440
+ >>> peaks = np.array([5])
441
+ >>> plt.plot(x)
442
+ >>> plt.plot(peaks, x[peaks], "x")
443
+ >>> plt.show()
444
+ >>> peak_prominences(x, peaks) # -> (prominences, left_bases, right_bases)
445
+ (array([3.]), array([2]), array([6]))
446
+
447
+ Note how the peak at index 3 of the same height is not considered as a
448
+ border while searching for the left base. Instead, two minima at 0 and 2
449
+ are found in which case the one closer to the evaluated peak is always
450
+ chosen. On the right side, however, the base must be placed at 6 because the
451
+ higher peak represents the right border to the evaluated area.
452
+
453
+ >>> peak_prominences(x, peaks, wlen=3.1)
454
+ (array([2.]), array([4]), array([6]))
455
+
456
+ Here, we restricted the algorithm to a window from 3 to 7 (the length is 5
457
+ samples because `wlen` was rounded up to the next odd integer). Thus, the
458
+ only two candidates in the evaluated area are the two neighboring samples
459
+ and a smaller prominence is calculated.
460
+ """
461
+ x = _arg_x_as_expected(x)
462
+ peaks = _arg_peaks_as_expected(peaks)
463
+ wlen = _arg_wlen_as_expected(wlen)
464
+ return _peak_prominences(x, peaks, wlen)
465
+
466
+
467
+ def peak_widths(x, peaks, rel_height=0.5, prominence_data=None, wlen=None):
468
+ """
469
+ Calculate the width of each peak in a signal.
470
+
471
+ This function calculates the width of a peak in samples at a relative
472
+ distance to the peak's height and prominence.
473
+
474
+ Parameters
475
+ ----------
476
+ x : sequence
477
+ A signal with peaks.
478
+ peaks : sequence
479
+ Indices of peaks in `x`.
480
+ rel_height : float, optional
481
+ Chooses the relative height at which the peak width is measured as a
482
+ percentage of its prominence. 1.0 calculates the width of the peak at
483
+ its lowest contour line while 0.5 evaluates at half the prominence
484
+ height. Must be at least 0. See notes for further explanation.
485
+ prominence_data : tuple, optional
486
+ A tuple of three arrays matching the output of `peak_prominences` when
487
+ called with the same arguments `x` and `peaks`. This data are calculated
488
+ internally if not provided.
489
+ wlen : int, optional
490
+ A window length in samples passed to `peak_prominences` as an optional
491
+ argument for internal calculation of `prominence_data`. This argument
492
+ is ignored if `prominence_data` is given.
493
+
494
+ Returns
495
+ -------
496
+ widths : ndarray
497
+ The widths for each peak in samples.
498
+ width_heights : ndarray
499
+ The height of the contour lines at which the `widths` where evaluated.
500
+ left_ips, right_ips : ndarray
501
+ Interpolated positions of left and right intersection points of a
502
+ horizontal line at the respective evaluation height.
503
+
504
+ Raises
505
+ ------
506
+ ValueError
507
+ If `prominence_data` is supplied but doesn't satisfy the condition
508
+ ``0 <= left_base <= peak <= right_base < x.shape[0]`` for each peak,
509
+ has the wrong dtype, is not C-contiguous or does not have the same
510
+ shape.
511
+
512
+ Warns
513
+ -----
514
+ PeakPropertyWarning
515
+ Raised if any calculated width is 0. This may stem from the supplied
516
+ `prominence_data` or if `rel_height` is set to 0.
517
+
518
+ Warnings
519
+ --------
520
+ This function may return unexpected results for data containing NaNs. To
521
+ avoid this, NaNs should either be removed or replaced.
522
+
523
+ See Also
524
+ --------
525
+ find_peaks
526
+ Find peaks inside a signal based on peak properties.
527
+ peak_prominences
528
+ Calculate the prominence of peaks.
529
+
530
+ Notes
531
+ -----
532
+ The basic algorithm to calculate a peak's width is as follows:
533
+
534
+ * Calculate the evaluation height :math:`h_{eval}` with the formula
535
+ :math:`h_{eval} = h_{Peak} - P \\cdot R`, where :math:`h_{Peak}` is the
536
+ height of the peak itself, :math:`P` is the peak's prominence and
537
+ :math:`R` a positive ratio specified with the argument `rel_height`.
538
+ * Draw a horizontal line at the evaluation height to both sides, starting at
539
+ the peak's current vertical position until the lines either intersect a
540
+ slope, the signal border or cross the vertical position of the peak's
541
+ base (see `peak_prominences` for an definition). For the first case,
542
+ intersection with the signal, the true intersection point is estimated
543
+ with linear interpolation.
544
+ * Calculate the width as the horizontal distance between the chosen
545
+ endpoints on both sides. As a consequence of this the maximal possible
546
+ width for each peak is the horizontal distance between its bases.
547
+
548
+ As shown above to calculate a peak's width its prominence and bases must be
549
+ known. You can supply these yourself with the argument `prominence_data`.
550
+ Otherwise, they are internally calculated (see `peak_prominences`).
551
+
552
+ .. versionadded:: 1.1.0
553
+
554
+ Examples
555
+ --------
556
+ >>> import numpy as np
557
+ >>> from scipy.signal import chirp, find_peaks, peak_widths
558
+ >>> import matplotlib.pyplot as plt
559
+
560
+ Create a test signal with two overlaid harmonics
561
+
562
+ >>> x = np.linspace(0, 6 * np.pi, 1000)
563
+ >>> x = np.sin(x) + 0.6 * np.sin(2.6 * x)
564
+
565
+ Find all peaks and calculate their widths at the relative height of 0.5
566
+ (contour line at half the prominence height) and 1 (at the lowest contour
567
+ line at full prominence height).
568
+
569
+ >>> peaks, _ = find_peaks(x)
570
+ >>> results_half = peak_widths(x, peaks, rel_height=0.5)
571
+ >>> results_half[0] # widths
572
+ array([ 64.25172825, 41.29465463, 35.46943289, 104.71586081,
573
+ 35.46729324, 41.30429622, 181.93835853, 45.37078546])
574
+ >>> results_full = peak_widths(x, peaks, rel_height=1)
575
+ >>> results_full[0] # widths
576
+ array([181.9396084 , 72.99284945, 61.28657872, 373.84622694,
577
+ 61.78404617, 72.48822812, 253.09161876, 79.36860878])
578
+
579
+ Plot signal, peaks and contour lines at which the widths where calculated
580
+
581
+ >>> plt.plot(x)
582
+ >>> plt.plot(peaks, x[peaks], "x")
583
+ >>> plt.hlines(*results_half[1:], color="C2")
584
+ >>> plt.hlines(*results_full[1:], color="C3")
585
+ >>> plt.show()
586
+ """
587
+ x = _arg_x_as_expected(x)
588
+ peaks = _arg_peaks_as_expected(peaks)
589
+ if prominence_data is None:
590
+ # Calculate prominence if not supplied and use wlen if supplied.
591
+ wlen = _arg_wlen_as_expected(wlen)
592
+ prominence_data = _peak_prominences(x, peaks, wlen)
593
+ return _peak_widths(x, peaks, rel_height, *prominence_data)
594
+
595
+
596
+ def _unpack_condition_args(interval, x, peaks):
597
+ """
598
+ Parse condition arguments for `find_peaks`.
599
+
600
+ Parameters
601
+ ----------
602
+ interval : number or ndarray or sequence
603
+ Either a number or ndarray or a 2-element sequence of the former. The
604
+ first value is always interpreted as `imin` and the second, if supplied,
605
+ as `imax`.
606
+ x : ndarray
607
+ The signal with `peaks`.
608
+ peaks : ndarray
609
+ An array with indices used to reduce `imin` and / or `imax` if those are
610
+ arrays.
611
+
612
+ Returns
613
+ -------
614
+ imin, imax : number or ndarray or None
615
+ Minimal and maximal value in `argument`.
616
+
617
+ Raises
618
+ ------
619
+ ValueError :
620
+ If interval border is given as array and its size does not match the size
621
+ of `x`.
622
+
623
+ Notes
624
+ -----
625
+
626
+ .. versionadded:: 1.1.0
627
+ """
628
+ try:
629
+ imin, imax = interval
630
+ except (TypeError, ValueError):
631
+ imin, imax = (interval, None)
632
+
633
+ # Reduce arrays if arrays
634
+ if isinstance(imin, np.ndarray):
635
+ if imin.size != x.size:
636
+ raise ValueError('array size of lower interval border must match x')
637
+ imin = imin[peaks]
638
+ if isinstance(imax, np.ndarray):
639
+ if imax.size != x.size:
640
+ raise ValueError('array size of upper interval border must match x')
641
+ imax = imax[peaks]
642
+
643
+ return imin, imax
644
+
645
+
646
+ def _select_by_property(peak_properties, pmin, pmax):
647
+ """
648
+ Evaluate where the generic property of peaks confirms to an interval.
649
+
650
+ Parameters
651
+ ----------
652
+ peak_properties : ndarray
653
+ An array with properties for each peak.
654
+ pmin : None or number or ndarray
655
+ Lower interval boundary for `peak_properties`. ``None`` is interpreted as
656
+ an open border.
657
+ pmax : None or number or ndarray
658
+ Upper interval boundary for `peak_properties`. ``None`` is interpreted as
659
+ an open border.
660
+
661
+ Returns
662
+ -------
663
+ keep : bool
664
+ A boolean mask evaluating to true where `peak_properties` confirms to the
665
+ interval.
666
+
667
+ See Also
668
+ --------
669
+ find_peaks
670
+
671
+ Notes
672
+ -----
673
+
674
+ .. versionadded:: 1.1.0
675
+ """
676
+ keep = np.ones(peak_properties.size, dtype=bool)
677
+ if pmin is not None:
678
+ keep &= (pmin <= peak_properties)
679
+ if pmax is not None:
680
+ keep &= (peak_properties <= pmax)
681
+ return keep
682
+
683
+
684
+ def _select_by_peak_threshold(x, peaks, tmin, tmax):
685
+ """
686
+ Evaluate which peaks fulfill the threshold condition.
687
+
688
+ Parameters
689
+ ----------
690
+ x : ndarray
691
+ A 1-D array which is indexable by `peaks`.
692
+ peaks : ndarray
693
+ Indices of peaks in `x`.
694
+ tmin, tmax : scalar or ndarray or None
695
+ Minimal and / or maximal required thresholds. If supplied as ndarrays
696
+ their size must match `peaks`. ``None`` is interpreted as an open
697
+ border.
698
+
699
+ Returns
700
+ -------
701
+ keep : bool
702
+ A boolean mask evaluating to true where `peaks` fulfill the threshold
703
+ condition.
704
+ left_thresholds, right_thresholds : ndarray
705
+ Array matching `peak` containing the thresholds of each peak on
706
+ both sides.
707
+
708
+ Notes
709
+ -----
710
+
711
+ .. versionadded:: 1.1.0
712
+ """
713
+ # Stack thresholds on both sides to make min / max operations easier:
714
+ # tmin is compared with the smaller, and tmax with the greater threshold to
715
+ # each peak's side
716
+ stacked_thresholds = np.vstack([x[peaks] - x[peaks - 1],
717
+ x[peaks] - x[peaks + 1]])
718
+ keep = np.ones(peaks.size, dtype=bool)
719
+ if tmin is not None:
720
+ min_thresholds = np.min(stacked_thresholds, axis=0)
721
+ keep &= (tmin <= min_thresholds)
722
+ if tmax is not None:
723
+ max_thresholds = np.max(stacked_thresholds, axis=0)
724
+ keep &= (max_thresholds <= tmax)
725
+
726
+ return keep, stacked_thresholds[0], stacked_thresholds[1]
727
+
728
+
729
+ def find_peaks(x, height=None, threshold=None, distance=None,
730
+ prominence=None, width=None, wlen=None, rel_height=0.5,
731
+ plateau_size=None):
732
+ """
733
+ Find peaks inside a signal based on peak properties.
734
+
735
+ This function takes a 1-D array and finds all local maxima by
736
+ simple comparison of neighboring values. Optionally, a subset of these
737
+ peaks can be selected by specifying conditions for a peak's properties.
738
+
739
+ Parameters
740
+ ----------
741
+ x : sequence
742
+ A signal with peaks.
743
+ height : number or ndarray or sequence, optional
744
+ Required height of peaks. Either a number, ``None``, an array matching
745
+ `x` or a 2-element sequence of the former. The first element is
746
+ always interpreted as the minimal and the second, if supplied, as the
747
+ maximal required height.
748
+ threshold : number or ndarray or sequence, optional
749
+ Required threshold of peaks, the vertical distance to its neighboring
750
+ samples. Either a number, ``None``, an array matching `x` or a
751
+ 2-element sequence of the former. The first element is always
752
+ interpreted as the minimal and the second, if supplied, as the maximal
753
+ required threshold.
754
+ distance : number, optional
755
+ Required minimal horizontal distance (>= 1) in samples between
756
+ neighbouring peaks. Smaller peaks are removed first until the condition
757
+ is fulfilled for all remaining peaks.
758
+ prominence : number or ndarray or sequence, optional
759
+ Required prominence of peaks. Either a number, ``None``, an array
760
+ matching `x` or a 2-element sequence of the former. The first
761
+ element is always interpreted as the minimal and the second, if
762
+ supplied, as the maximal required prominence.
763
+ width : number or ndarray or sequence, optional
764
+ Required width of peaks in samples. Either a number, ``None``, an array
765
+ matching `x` or a 2-element sequence of the former. The first
766
+ element is always interpreted as the minimal and the second, if
767
+ supplied, as the maximal required width.
768
+ wlen : int, optional
769
+ Used for calculation of the peaks prominences, thus it is only used if
770
+ one of the arguments `prominence` or `width` is given. See argument
771
+ `wlen` in `peak_prominences` for a full description of its effects.
772
+ rel_height : float, optional
773
+ Used for calculation of the peaks width, thus it is only used if `width`
774
+ is given. See argument `rel_height` in `peak_widths` for a full
775
+ description of its effects.
776
+ plateau_size : number or ndarray or sequence, optional
777
+ Required size of the flat top of peaks in samples. Either a number,
778
+ ``None``, an array matching `x` or a 2-element sequence of the former.
779
+ The first element is always interpreted as the minimal and the second,
780
+ if supplied as the maximal required plateau size.
781
+
782
+ .. versionadded:: 1.2.0
783
+
784
+ Returns
785
+ -------
786
+ peaks : ndarray
787
+ Indices of peaks in `x` that satisfy all given conditions.
788
+ properties : dict
789
+ A dictionary containing properties of the returned peaks which were
790
+ calculated as intermediate results during evaluation of the specified
791
+ conditions:
792
+
793
+ * 'peak_heights'
794
+ If `height` is given, the height of each peak in `x`.
795
+ * 'left_thresholds', 'right_thresholds'
796
+ If `threshold` is given, these keys contain a peaks vertical
797
+ distance to its neighbouring samples.
798
+ * 'prominences', 'right_bases', 'left_bases'
799
+ If `prominence` is given, these keys are accessible. See
800
+ `peak_prominences` for a description of their content.
801
+ * 'widths', 'width_heights', 'left_ips', 'right_ips'
802
+ If `width` is given, these keys are accessible. See `peak_widths`
803
+ for a description of their content.
804
+ * 'plateau_sizes', left_edges', 'right_edges'
805
+ If `plateau_size` is given, these keys are accessible and contain
806
+ the indices of a peak's edges (edges are still part of the
807
+ plateau) and the calculated plateau sizes.
808
+
809
+ .. versionadded:: 1.2.0
810
+
811
+ To calculate and return properties without excluding peaks, provide the
812
+ open interval ``(None, None)`` as a value to the appropriate argument
813
+ (excluding `distance`).
814
+
815
+ Warns
816
+ -----
817
+ PeakPropertyWarning
818
+ Raised if a peak's properties have unexpected values (see
819
+ `peak_prominences` and `peak_widths`).
820
+
821
+ Warnings
822
+ --------
823
+ This function may return unexpected results for data containing NaNs. To
824
+ avoid this, NaNs should either be removed or replaced.
825
+
826
+ See Also
827
+ --------
828
+ find_peaks_cwt
829
+ Find peaks using the wavelet transformation.
830
+ peak_prominences
831
+ Directly calculate the prominence of peaks.
832
+ peak_widths
833
+ Directly calculate the width of peaks.
834
+
835
+ Notes
836
+ -----
837
+ In the context of this function, a peak or local maximum is defined as any
838
+ sample whose two direct neighbours have a smaller amplitude. For flat peaks
839
+ (more than one sample of equal amplitude wide) the index of the middle
840
+ sample is returned (rounded down in case the number of samples is even).
841
+ For noisy signals the peak locations can be off because the noise might
842
+ change the position of local maxima. In those cases consider smoothing the
843
+ signal before searching for peaks or use other peak finding and fitting
844
+ methods (like `find_peaks_cwt`).
845
+
846
+ Some additional comments on specifying conditions:
847
+
848
+ * Almost all conditions (excluding `distance`) can be given as half-open or
849
+ closed intervals, e.g., ``1`` or ``(1, None)`` defines the half-open
850
+ interval :math:`[1, \\infty]` while ``(None, 1)`` defines the interval
851
+ :math:`[-\\infty, 1]`. The open interval ``(None, None)`` can be specified
852
+ as well, which returns the matching properties without exclusion of peaks.
853
+ * The border is always included in the interval used to select valid peaks.
854
+ * For several conditions the interval borders can be specified with
855
+ arrays matching `x` in shape which enables dynamic constrains based on
856
+ the sample position.
857
+ * The conditions are evaluated in the following order: `plateau_size`,
858
+ `height`, `threshold`, `distance`, `prominence`, `width`. In most cases
859
+ this order is the fastest one because faster operations are applied first
860
+ to reduce the number of peaks that need to be evaluated later.
861
+ * While indices in `peaks` are guaranteed to be at least `distance` samples
862
+ apart, edges of flat peaks may be closer than the allowed `distance`.
863
+ * Use `wlen` to reduce the time it takes to evaluate the conditions for
864
+ `prominence` or `width` if `x` is large or has many local maxima
865
+ (see `peak_prominences`).
866
+
867
+ .. versionadded:: 1.1.0
868
+
869
+ Examples
870
+ --------
871
+ To demonstrate this function's usage we use a signal `x` supplied with
872
+ SciPy (see `scipy.datasets.electrocardiogram`). Let's find all peaks (local
873
+ maxima) in `x` whose amplitude lies above 0.
874
+
875
+ >>> import numpy as np
876
+ >>> import matplotlib.pyplot as plt
877
+ >>> from scipy.datasets import electrocardiogram
878
+ >>> from scipy.signal import find_peaks
879
+ >>> x = electrocardiogram()[2000:4000]
880
+ >>> peaks, _ = find_peaks(x, height=0)
881
+ >>> plt.plot(x)
882
+ >>> plt.plot(peaks, x[peaks], "x")
883
+ >>> plt.plot(np.zeros_like(x), "--", color="gray")
884
+ >>> plt.show()
885
+
886
+ We can select peaks below 0 with ``height=(None, 0)`` or use arrays matching
887
+ `x` in size to reflect a changing condition for different parts of the
888
+ signal.
889
+
890
+ >>> border = np.sin(np.linspace(0, 3 * np.pi, x.size))
891
+ >>> peaks, _ = find_peaks(x, height=(-border, border))
892
+ >>> plt.plot(x)
893
+ >>> plt.plot(-border, "--", color="gray")
894
+ >>> plt.plot(border, ":", color="gray")
895
+ >>> plt.plot(peaks, x[peaks], "x")
896
+ >>> plt.show()
897
+
898
+ Another useful condition for periodic signals can be given with the
899
+ `distance` argument. In this case, we can easily select the positions of
900
+ QRS complexes within the electrocardiogram (ECG) by demanding a distance of
901
+ at least 150 samples.
902
+
903
+ >>> peaks, _ = find_peaks(x, distance=150)
904
+ >>> np.diff(peaks)
905
+ array([186, 180, 177, 171, 177, 169, 167, 164, 158, 162, 172])
906
+ >>> plt.plot(x)
907
+ >>> plt.plot(peaks, x[peaks], "x")
908
+ >>> plt.show()
909
+
910
+ Especially for noisy signals peaks can be easily grouped by their
911
+ prominence (see `peak_prominences`). E.g., we can select all peaks except
912
+ for the mentioned QRS complexes by limiting the allowed prominence to 0.6.
913
+
914
+ >>> peaks, properties = find_peaks(x, prominence=(None, 0.6))
915
+ >>> properties["prominences"].max()
916
+ 0.5049999999999999
917
+ >>> plt.plot(x)
918
+ >>> plt.plot(peaks, x[peaks], "x")
919
+ >>> plt.show()
920
+
921
+ And, finally, let's examine a different section of the ECG which contains
922
+ beat forms of different shape. To select only the atypical heart beats, we
923
+ combine two conditions: a minimal prominence of 1 and width of at least 20
924
+ samples.
925
+
926
+ >>> x = electrocardiogram()[17000:18000]
927
+ >>> peaks, properties = find_peaks(x, prominence=1, width=20)
928
+ >>> properties["prominences"], properties["widths"]
929
+ (array([1.495, 2.3 ]), array([36.93773946, 39.32723577]))
930
+ >>> plt.plot(x)
931
+ >>> plt.plot(peaks, x[peaks], "x")
932
+ >>> plt.vlines(x=peaks, ymin=x[peaks] - properties["prominences"],
933
+ ... ymax = x[peaks], color = "C1")
934
+ >>> plt.hlines(y=properties["width_heights"], xmin=properties["left_ips"],
935
+ ... xmax=properties["right_ips"], color = "C1")
936
+ >>> plt.show()
937
+ """
938
+ # _argmaxima1d expects array of dtype 'float64'
939
+ x = _arg_x_as_expected(x)
940
+ if distance is not None and distance < 1:
941
+ raise ValueError('`distance` must be greater or equal to 1')
942
+
943
+ peaks, left_edges, right_edges = _local_maxima_1d(x)
944
+ properties = {}
945
+
946
+ if plateau_size is not None:
947
+ # Evaluate plateau size
948
+ plateau_sizes = right_edges - left_edges + 1
949
+ pmin, pmax = _unpack_condition_args(plateau_size, x, peaks)
950
+ keep = _select_by_property(plateau_sizes, pmin, pmax)
951
+ peaks = peaks[keep]
952
+ properties["plateau_sizes"] = plateau_sizes
953
+ properties["left_edges"] = left_edges
954
+ properties["right_edges"] = right_edges
955
+ properties = {key: array[keep] for key, array in properties.items()}
956
+
957
+ if height is not None:
958
+ # Evaluate height condition
959
+ peak_heights = x[peaks]
960
+ hmin, hmax = _unpack_condition_args(height, x, peaks)
961
+ keep = _select_by_property(peak_heights, hmin, hmax)
962
+ peaks = peaks[keep]
963
+ properties["peak_heights"] = peak_heights
964
+ properties = {key: array[keep] for key, array in properties.items()}
965
+
966
+ if threshold is not None:
967
+ # Evaluate threshold condition
968
+ tmin, tmax = _unpack_condition_args(threshold, x, peaks)
969
+ keep, left_thresholds, right_thresholds = _select_by_peak_threshold(
970
+ x, peaks, tmin, tmax)
971
+ peaks = peaks[keep]
972
+ properties["left_thresholds"] = left_thresholds
973
+ properties["right_thresholds"] = right_thresholds
974
+ properties = {key: array[keep] for key, array in properties.items()}
975
+
976
+ if distance is not None:
977
+ # Evaluate distance condition
978
+ keep = _select_by_peak_distance(peaks, x[peaks], distance)
979
+ peaks = peaks[keep]
980
+ properties = {key: array[keep] for key, array in properties.items()}
981
+
982
+ if prominence is not None or width is not None:
983
+ # Calculate prominence (required for both conditions)
984
+ wlen = _arg_wlen_as_expected(wlen)
985
+ properties.update(zip(
986
+ ['prominences', 'left_bases', 'right_bases'],
987
+ _peak_prominences(x, peaks, wlen=wlen)
988
+ ))
989
+
990
+ if prominence is not None:
991
+ # Evaluate prominence condition
992
+ pmin, pmax = _unpack_condition_args(prominence, x, peaks)
993
+ keep = _select_by_property(properties['prominences'], pmin, pmax)
994
+ peaks = peaks[keep]
995
+ properties = {key: array[keep] for key, array in properties.items()}
996
+
997
+ if width is not None:
998
+ # Calculate widths
999
+ properties.update(zip(
1000
+ ['widths', 'width_heights', 'left_ips', 'right_ips'],
1001
+ _peak_widths(x, peaks, rel_height, properties['prominences'],
1002
+ properties['left_bases'], properties['right_bases'])
1003
+ ))
1004
+ # Evaluate width condition
1005
+ wmin, wmax = _unpack_condition_args(width, x, peaks)
1006
+ keep = _select_by_property(properties['widths'], wmin, wmax)
1007
+ peaks = peaks[keep]
1008
+ properties = {key: array[keep] for key, array in properties.items()}
1009
+
1010
+ return peaks, properties
1011
+
1012
+
1013
+ def _identify_ridge_lines(matr, max_distances, gap_thresh):
1014
+ """
1015
+ Identify ridges in the 2-D matrix.
1016
+
1017
+ Expect that the width of the wavelet feature increases with increasing row
1018
+ number.
1019
+
1020
+ Parameters
1021
+ ----------
1022
+ matr : 2-D ndarray
1023
+ Matrix in which to identify ridge lines.
1024
+ max_distances : 1-D sequence
1025
+ At each row, a ridge line is only connected
1026
+ if the relative max at row[n] is within
1027
+ `max_distances`[n] from the relative max at row[n+1].
1028
+ gap_thresh : int
1029
+ If a relative maximum is not found within `max_distances`,
1030
+ there will be a gap. A ridge line is discontinued if
1031
+ there are more than `gap_thresh` points without connecting
1032
+ a new relative maximum.
1033
+
1034
+ Returns
1035
+ -------
1036
+ ridge_lines : tuple
1037
+ Tuple of 2 1-D sequences. `ridge_lines`[ii][0] are the rows of the
1038
+ ii-th ridge-line, `ridge_lines`[ii][1] are the columns. Empty if none
1039
+ found. Each ridge-line will be sorted by row (increasing), but the
1040
+ order of the ridge lines is not specified.
1041
+
1042
+ References
1043
+ ----------
1044
+ .. [1] Bioinformatics (2006) 22 (17): 2059-2065.
1045
+ :doi:`10.1093/bioinformatics/btl355`
1046
+
1047
+ Examples
1048
+ --------
1049
+ >>> import numpy as np
1050
+ >>> from scipy.signal._peak_finding import _identify_ridge_lines
1051
+ >>> rng = np.random.default_rng()
1052
+ >>> data = rng.random((5,5))
1053
+ >>> max_dist = 3
1054
+ >>> max_distances = np.full(20, max_dist)
1055
+ >>> ridge_lines = _identify_ridge_lines(data, max_distances, 1)
1056
+
1057
+ Notes
1058
+ -----
1059
+ This function is intended to be used in conjunction with `cwt`
1060
+ as part of `find_peaks_cwt`.
1061
+
1062
+ """
1063
+ if len(max_distances) < matr.shape[0]:
1064
+ raise ValueError('Max_distances must have at least as many rows '
1065
+ 'as matr')
1066
+
1067
+ all_max_cols = _boolrelextrema(matr, np.greater, axis=1, order=1)
1068
+ # Highest row for which there are any relative maxima
1069
+ has_relmax = np.nonzero(all_max_cols.any(axis=1))[0]
1070
+ if len(has_relmax) == 0:
1071
+ return []
1072
+ start_row = has_relmax[-1]
1073
+ # Each ridge line is a 3-tuple:
1074
+ # rows, cols,Gap number
1075
+ ridge_lines = [[[start_row],
1076
+ [col],
1077
+ 0] for col in np.nonzero(all_max_cols[start_row])[0]]
1078
+ final_lines = []
1079
+ rows = np.arange(start_row - 1, -1, -1)
1080
+ cols = np.arange(0, matr.shape[1])
1081
+ for row in rows:
1082
+ this_max_cols = cols[all_max_cols[row]]
1083
+
1084
+ # Increment gap number of each line,
1085
+ # set it to zero later if appropriate
1086
+ for line in ridge_lines:
1087
+ line[2] += 1
1088
+
1089
+ # XXX These should always be all_max_cols[row]
1090
+ # But the order might be different. Might be an efficiency gain
1091
+ # to make sure the order is the same and avoid this iteration
1092
+ prev_ridge_cols = np.array([line[1][-1] for line in ridge_lines])
1093
+ # Look through every relative maximum found at current row
1094
+ # Attempt to connect them with existing ridge lines.
1095
+ for ind, col in enumerate(this_max_cols):
1096
+ # If there is a previous ridge line within
1097
+ # the max_distance to connect to, do so.
1098
+ # Otherwise start a new one.
1099
+ line = None
1100
+ if len(prev_ridge_cols) > 0:
1101
+ diffs = np.abs(col - prev_ridge_cols)
1102
+ closest = np.argmin(diffs)
1103
+ if diffs[closest] <= max_distances[row]:
1104
+ line = ridge_lines[closest]
1105
+ if line is not None:
1106
+ # Found a point close enough, extend current ridge line
1107
+ line[1].append(col)
1108
+ line[0].append(row)
1109
+ line[2] = 0
1110
+ else:
1111
+ new_line = [[row],
1112
+ [col],
1113
+ 0]
1114
+ ridge_lines.append(new_line)
1115
+
1116
+ # Remove the ridge lines with gap_number too high
1117
+ # XXX Modifying a list while iterating over it.
1118
+ # Should be safe, since we iterate backwards, but
1119
+ # still tacky.
1120
+ for ind in range(len(ridge_lines) - 1, -1, -1):
1121
+ line = ridge_lines[ind]
1122
+ if line[2] > gap_thresh:
1123
+ final_lines.append(line)
1124
+ del ridge_lines[ind]
1125
+
1126
+ out_lines = []
1127
+ for line in (final_lines + ridge_lines):
1128
+ sortargs = np.array(np.argsort(line[0]))
1129
+ rows, cols = np.zeros_like(sortargs), np.zeros_like(sortargs)
1130
+ rows[sortargs] = line[0]
1131
+ cols[sortargs] = line[1]
1132
+ out_lines.append([rows, cols])
1133
+
1134
+ return out_lines
1135
+
1136
+
1137
+ def _filter_ridge_lines(cwt, ridge_lines, window_size=None, min_length=None,
1138
+ min_snr=1, noise_perc=10):
1139
+ """
1140
+ Filter ridge lines according to prescribed criteria. Intended
1141
+ to be used for finding relative maxima.
1142
+
1143
+ Parameters
1144
+ ----------
1145
+ cwt : 2-D ndarray
1146
+ Continuous wavelet transform from which the `ridge_lines` were defined.
1147
+ ridge_lines : 1-D sequence
1148
+ Each element should contain 2 sequences, the rows and columns
1149
+ of the ridge line (respectively).
1150
+ window_size : int, optional
1151
+ Size of window to use to calculate noise floor.
1152
+ Default is ``cwt.shape[1] / 20``.
1153
+ min_length : int, optional
1154
+ Minimum length a ridge line needs to be acceptable.
1155
+ Default is ``cwt.shape[0] / 4``, ie 1/4-th the number of widths.
1156
+ min_snr : float, optional
1157
+ Minimum SNR ratio. Default 1. The signal is the value of
1158
+ the cwt matrix at the shortest length scale (``cwt[0, loc]``), the
1159
+ noise is the `noise_perc`\\ th percentile of datapoints contained within a
1160
+ window of `window_size` around ``cwt[0, loc]``.
1161
+ noise_perc : float, optional
1162
+ When calculating the noise floor, percentile of data points
1163
+ examined below which to consider noise. Calculated using
1164
+ scipy.stats.scoreatpercentile.
1165
+
1166
+ References
1167
+ ----------
1168
+ .. [1] Bioinformatics (2006) 22 (17): 2059-2065.
1169
+ :doi:`10.1093/bioinformatics/btl355`
1170
+
1171
+ """
1172
+ num_points = cwt.shape[1]
1173
+ if min_length is None:
1174
+ min_length = np.ceil(cwt.shape[0] / 4)
1175
+ if window_size is None:
1176
+ window_size = np.ceil(num_points / 20)
1177
+
1178
+ window_size = int(window_size)
1179
+ hf_window, odd = divmod(window_size, 2)
1180
+
1181
+ # Filter based on SNR
1182
+ row_one = cwt[0, :]
1183
+ noises = np.empty_like(row_one)
1184
+ for ind, val in enumerate(row_one):
1185
+ window_start = max(ind - hf_window, 0)
1186
+ window_end = min(ind + hf_window + odd, num_points)
1187
+ noises[ind] = scoreatpercentile(row_one[window_start:window_end],
1188
+ per=noise_perc)
1189
+
1190
+ def filt_func(line):
1191
+ if len(line[0]) < min_length:
1192
+ return False
1193
+ snr = abs(cwt[line[0][0], line[1][0]] / noises[line[1][0]])
1194
+ if snr < min_snr:
1195
+ return False
1196
+ return True
1197
+
1198
+ return list(filter(filt_func, ridge_lines))
1199
+
1200
+
1201
+ def find_peaks_cwt(vector, widths, wavelet=None, max_distances=None,
1202
+ gap_thresh=None, min_length=None,
1203
+ min_snr=1, noise_perc=10, window_size=None):
1204
+ """
1205
+ Find peaks in a 1-D array with wavelet transformation.
1206
+
1207
+ The general approach is to smooth `vector` by convolving it with
1208
+ `wavelet(width)` for each width in `widths`. Relative maxima which
1209
+ appear at enough length scales, and with sufficiently high SNR, are
1210
+ accepted.
1211
+
1212
+ Parameters
1213
+ ----------
1214
+ vector : ndarray
1215
+ 1-D array in which to find the peaks.
1216
+ widths : float or sequence
1217
+ Single width or 1-D array-like of widths to use for calculating
1218
+ the CWT matrix. In general,
1219
+ this range should cover the expected width of peaks of interest.
1220
+ wavelet : callable, optional
1221
+ Should take two parameters and return a 1-D array to convolve
1222
+ with `vector`. The first parameter determines the number of points
1223
+ of the returned wavelet array, the second parameter is the scale
1224
+ (`width`) of the wavelet. Should be normalized and symmetric.
1225
+ Default is the ricker wavelet.
1226
+ max_distances : ndarray, optional
1227
+ At each row, a ridge line is only connected if the relative max at
1228
+ row[n] is within ``max_distances[n]`` from the relative max at
1229
+ ``row[n+1]``. Default value is ``widths/4``.
1230
+ gap_thresh : float, optional
1231
+ If a relative maximum is not found within `max_distances`,
1232
+ there will be a gap. A ridge line is discontinued if there are more
1233
+ than `gap_thresh` points without connecting a new relative maximum.
1234
+ Default is the first value of the widths array i.e. widths[0].
1235
+ min_length : int, optional
1236
+ Minimum length a ridge line needs to be acceptable.
1237
+ Default is ``cwt.shape[0] / 4``, ie 1/4-th the number of widths.
1238
+ min_snr : float, optional
1239
+ Minimum SNR ratio. Default 1. The signal is the maximum CWT coefficient
1240
+ on the largest ridge line. The noise is `noise_perc` th percentile of
1241
+ datapoints contained within the same ridge line.
1242
+ noise_perc : float, optional
1243
+ When calculating the noise floor, percentile of data points
1244
+ examined below which to consider noise. Calculated using
1245
+ `stats.scoreatpercentile`. Default is 10.
1246
+ window_size : int, optional
1247
+ Size of window to use to calculate noise floor.
1248
+ Default is ``cwt.shape[1] / 20``.
1249
+
1250
+ Returns
1251
+ -------
1252
+ peaks_indices : ndarray
1253
+ Indices of the locations in the `vector` where peaks were found.
1254
+ The list is sorted.
1255
+
1256
+ See Also
1257
+ --------
1258
+ find_peaks
1259
+ Find peaks inside a signal based on peak properties.
1260
+
1261
+ Notes
1262
+ -----
1263
+ This approach was designed for finding sharp peaks among noisy data,
1264
+ however with proper parameter selection it should function well for
1265
+ different peak shapes.
1266
+
1267
+ The algorithm is as follows:
1268
+ 1. Perform a continuous wavelet transform on `vector`, for the supplied
1269
+ `widths`. This is a convolution of `vector` with `wavelet(width)` for
1270
+ each width in `widths`. See `cwt`.
1271
+ 2. Identify "ridge lines" in the cwt matrix. These are relative maxima
1272
+ at each row, connected across adjacent rows. See identify_ridge_lines
1273
+ 3. Filter the ridge_lines using filter_ridge_lines.
1274
+
1275
+ .. versionadded:: 0.11.0
1276
+
1277
+ References
1278
+ ----------
1279
+ .. [1] Bioinformatics (2006) 22 (17): 2059-2065.
1280
+ :doi:`10.1093/bioinformatics/btl355`
1281
+
1282
+ Examples
1283
+ --------
1284
+ >>> import numpy as np
1285
+ >>> from scipy import signal
1286
+ >>> xs = np.arange(0, np.pi, 0.05)
1287
+ >>> data = np.sin(xs)
1288
+ >>> peakind = signal.find_peaks_cwt(data, np.arange(1,10))
1289
+ >>> peakind, xs[peakind], data[peakind]
1290
+ ([32], array([ 1.6]), array([ 0.9995736]))
1291
+
1292
+ """
1293
+ widths = np.atleast_1d(np.asarray(widths))
1294
+
1295
+ if gap_thresh is None:
1296
+ gap_thresh = np.ceil(widths[0])
1297
+ if max_distances is None:
1298
+ max_distances = widths / 4.0
1299
+ if wavelet is None:
1300
+ wavelet = _ricker
1301
+
1302
+ cwt_dat = _cwt(vector, wavelet, widths)
1303
+ ridge_lines = _identify_ridge_lines(cwt_dat, max_distances, gap_thresh)
1304
+ filtered = _filter_ridge_lines(cwt_dat, ridge_lines, min_length=min_length,
1305
+ window_size=window_size, min_snr=min_snr,
1306
+ noise_perc=noise_perc)
1307
+ max_locs = np.asarray([x[1][0] for x in filtered])
1308
+ max_locs.sort()
1309
+
1310
+ return max_locs